Obtendo o PublicKeyToken de assemblies .Net


163

Qual é a maneira mais simples de encontrar o Token de Chave Pública de um assembly?

A maneira mais simples de pensar seria com um simples clique com o botão direito do mouse, obter chave pública, mas essa funcionalidade não existe, talvez haja uma extensão do Visual Studio para isso?

Estou usando o Visual Studio 2010, se uma extensão estiver disponível.


4
Consulte esta postagem do blog de Kirk Evans como obter o PublicKeyToken de uma montagem no Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
Acabei de instalar o EF6 e honestamente nem sei onde estão localizadas as montagens. Porcaria como essa leva horas do meu dia.
Froggythefrog

Respostas:


228

Abra um prompt de comando e digite uma das seguintes linhas de acordo com sua versão do Visual Studio e Arquitetura do Sistema Operacional:

VS 2008 no Windows de 32 bits :

"%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

VS 2008 no Windows de 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

VS 2010 no Windows de 32 bits:

"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

VS 2010 no Windows de 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

VS 2012 no Windows de 32 bits:

"%ProgramFiles%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

VS 2012 no Windows de 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

VS 2015 no Windows de 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exe" -T <assemblyname>

Observe que, para as versões VS2012 +, o aplicativo sn.exe não está mais na lixeira, mas em uma subpasta. Além disso, observe que para 64 bits você precisa especificar a pasta (x86).

Se você preferir usar o prompt de comando do Visual Studio, digite:

sn -T <assembly> 

onde <assemblyname>há um caminho completo do arquivo para a montagem em que você está interessado, entre aspas, se houver espaços.

Você pode adicionar isso como uma ferramenta externa no VS, como mostrado aqui:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -for-a-stong-named-assembly.aspx


1
Sim, eu sei disso, estou procurando uma maneira mais fácil, de preferência sem sair do VS
moi_meme

12
Substitua% ProgramFiles% por% ProgramFiles (x86)% se você estiver em uma máquina de 64 bits.
System.Cats.Lol

1
Para o VS2012 está abaixo "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Nota sn está dobrado em um nível extra de pasta após a bandeja (no NETFX 4.0 Tools).
GDS

2
Boa resposta elaborada. Para VS2015 deve estar sob% ProgramFiles% \ Microsoft SDKs \ Windows \ v10.0A \ bin (x86) \ netfx 4.6.1 Tools \ sn.exe
ThePatelGuy

1
Caminho VS2015 deve ser v10.0A, não V1.0A
Michael Itzoe

87

outra opção:

se você usa o PowerShell, pode descobrir como:

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("C:\Program Files (x86)\MySQL\Connector NET 6.6.5\Assemblies\v4.0\MySql.Data.dll")).FullName

gostar

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("dll full path")).FullName

e aparecerá como

MySql.Data, Versão = 6.6.5.0, Cultura = neutra, PublicKeyToken = c5687fc88969c44d


Impressionante, permita-me copiar e colar todo o resultado diretamente em uma configuração da Web se eu estiver adicionando manualmente assemblies. Obrigado!
GJKH

Ótima resposta, pois você também pode obter a versão (o que pode ser importante para a solução de problemas).
Sbkrogers

48

Se a biblioteca estiver incluída no projeto VS, você poderá verificar o .cprojarquivo, por exemplo:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...

2
Eu só vejo <Reference Include = "System.IdentityModel" /> (mesmo para outras asseblies)
FrenkyB

Não parece ser muito útil para assemblies nas bibliotecas do sistema .NET. por exemplo, para System.Configuration ele apenas diz<Reference Include="System.Configuration" />
Simon Tewsi

Parece que todas as montagens têm o mesmo PublicKeyToken, portanto, procurar na .cprojparece ser a solução mais fácil.
Asdf #

14

Se você incluiu a montagem em seu projeto, você pode:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }

não está recebendo o token de chave pública das DLLs em minhas Referências. Seu método realmente obtém toda a DLL nas referências de um determinado projeto? obrigado
Francis Saul

@FrancisSaul - lista apenas os assemblies que foram CARREGADOS na memória de processo do aplicativo; para ver detalhes de um assembly específico, primeiro execute o código que se refere a algum tipo nesse assembly. Por exemplo, crie uma nova instância de alguma classe nesse assembly.
Página

Este foi o método mais simples que funcionou para mim. Isso pode ser simplificado ainda mais: execute o aplicativo com um conjunto de pontos de interrupção. Quando a execução pára no ponto de interrupção, no tipo VS janela imediata: AppDomain.CurrentDomain.GetAssemblies(). Isso listará os assemblies carregados na Janela Imediata, com Versão, Cultura e PublicKeyToken para cada um.
Simon Tewsi 17/10

Também é possível executar no 'C # Interactive' - não é necessário compilar!
bTab

13

Você pode obter isso facilmente via c #

private static string GetPublicKeyTokenFromAssembly(Assembly assembly)
{
    var bytes = assembly.GetName().GetPublicKeyToken();
    if (bytes == null || bytes.Length == 0)
        return "None";

    var publicKeyToken = string.Empty;
    for (int i = 0; i < bytes.GetLength(0); i++)
        publicKeyToken += string.Format("{0:x2}", bytes[i]);

    return publicKeyToken;
}

Eu tentei seu código, mas não está funcionando. Desejo obter o token de chave pública do Stimulsoft.Report.Web.dll, que já está em minhas Referências. Copiei seu código e passei o nome da dll, mas não está funcionando. Meu código é mais ou menos assim: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Obviamente, o método está aceitando montagem, não um nome de string. Você pode me ajudar a usar seu método?
Francis Saul

@FrancisSaul O que o método retorna "Nenhum" ou um valor incorreto? Você já determinou que a assembléia é realmente de nome forte? Você pode verificar no VS no painel de propriedades a referência (nome forte). Você também pode verificar isso facilmente com a maioria dos descompiladores gratuitos, como o JustDecompile. Se você vir um nome forte, depure o código e inspecione os bytes.
Adam Caviness

Não consigo executar o projeto, depois de digitar o código s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"), ele diz que a melhor sobrecarga para o método tem argumentos inválidos.
Francis Saul

@FrancisSaul Você está passando um argumento de string para um método que usa um Assembly. Você pode typeof(YourPreferredTypeInThatAssembly).Assemblyou Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))passa isso para o método, se quiser.
Adam Caviness

Portanto, a sintaxe seria assim. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul

9

Você pode adicionar isso como uma ferramenta externa ao Visual Studio da seguinte maneira:

Título:

Get PublicKeyToken

Comando:

c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe

(O caminho pode variar entre as versões)

Argumentos:

-T "$(TargetPath)"

E marque a opção " Usar janela de saída ".


1
Quando você seleciona isso no Toolsmenu, ele opera automaticamente em qualquer projeto que você selecionou no Gerenciador de Soluções.
Contango 17/06

Renomeei meu comando para Get PublicKeyToken on Solution Explorer Selection.
Contango 17/06

1
Boa resposta! Dica: se você ativar a caixa de seleção "Solicitar argumentos", uma caixa de diálogo será aberta, permitindo colar um caminho nela. Assim, você pode copiar + colar um caminho de montagem da janela de propriedades, por exemplo. Isso foi muito útil para mim, especialmente quando tive que alterar os registros no web.config e não conhecia um token de chave pública de DLLs.
Matt


5

1) O comando é C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

No exemplo acima, o Microsoft SDK reside em C: \ Arquivos de Programas \ Microsoft SDKs \ Windows \ v6.0A. Seu ambiente pode ser diferente.

2) Para obter o token de chave pública de qualquer projeto, você pode adicionar sn.exe como parte de suas Ferramentas Externas no Visual Studio. As etapas são mostradas neste link da Microsoft: Como: Criar uma ferramenta para obter a chave pública de um assembly


Sim, eu sei disso, eu estou procurando uma maneira mais fácil, de preferência sem deixar VS
moi_meme


5

Como alternativa, você também pode usar linqassim -

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));

1
Ele pediu o token de chave pública. Seu código usa a chave pública. Deveria ser.GetPublicKeyToken()
Stefan Born

1

Um método alternativo seria se você tiver um descompilador, basta procurar lá, eles geralmente fornecem a chave pública. Eu observei .Net Reflector, Telerik Just Decompile e ILSpy apenas descompilam eles parecem ter o token de chave pública exibido.


1

Outra opção é usar a ferramenta de código aberto NuGet Package Explorer para isso.

Em um pacote Nuget (.nupkg), você pode verificar o PublicKeyToken ou arrastar o binário (.dll) na ferramenta. Para este último, selecione primeiro "Arquivo -> novo"

insira a descrição da imagem aqui


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.