Как получить PublicKeyToken из файла snk? Использование инструментов командной строки. Однако я подумал о том, что использование sn.exe не может найти подходящий параметр.
Получить .NET PublicKeyToken из файла snk?
Ответ 1
Если вы хотите использовать инструмент sn.exe
:
sn -p yourkey.snk publickey.snk
теперь существует файл publickey.snk с открытым ключом
sn -tp publickey.snk
теперь у вас есть как открытый ключ, так и токен открытого ключа.
Учитывая, что byte[]
заключает в себе файл snk, например
byte[] snk = File.ReadAllBytes("YourSnkFile.snk");
использование
byte[] publicKey = GetPublicKey(snk);
byte[] publicKeyToken = GetPublicKeyToken(publicKey);
с помощью этих методов утилиты
public static byte[] GetPublicKey(byte[] snk)
{
var snkp = new StrongNameKeyPair(snk);
byte[] publicKey = snkp.PublicKey;
return publicKey;
}
public static byte[] GetPublicKeyToken(byte[] publicKey)
{
using (var csp = new SHA1CryptoServiceProvider())
{
byte[] hash = csp.ComputeHash(publicKey);
byte[] token = new byte[8];
for (int i = 0; i < 8; i++)
{
token[i] = hash[hash.Length - i - 1];
}
return token;
}
}
Ответ 2
Чтобы извлечь токен открытого ключа из файла .snk с помощью sn.exe.
необходимо выполнить два шага.Извлеките открытый ключ из YourFile.snk
с помощью sn.exe и запишите его в Token.snk
sn -p YourFile.snk Token.snk
Извлеките токен открытого ключа из Token.snk
с помощью sn.exe и запишите его в PublicToken.txt
sn -t Token.snk > PublicToken.txt
Ответ 3
В дополнение к ответу @xanatos, версия PowerShell, если кому-то это нужно:
function Get-SnkPublicKey([string]$FilePath)
{
$bytes = [System.IO.File]::ReadAllBytes($FilePath)
$pair = New-Object System.Reflection.StrongNameKeyPair -ArgumentList @(,$bytes)
$publicKey = $pair.PublicKey
#[System.Convert]::ToBase64String($publicKey)
$hexes = [System.BitConverter]::ToString($publicKey);
$hexes.Replace("-", "")
}