Получить .NET PublicKeyToken из файла snk?

Как получить PublicKeyToken из файла snk? Использование инструментов командной строки. Однако я подумал о том, что использование sn.exe не может найти подходящий параметр.

Ответ 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("-", "")
}