Como localizo o PublicKeyToken para uma DLL específica?


197

Preciso recriar um provedor no meu arquivo web.config que se parece com isso:

<membership defaultProvider="AspNetSqlMemProvider">
  <providers>
    <clear/>
    <add connectionStringName="TRAQDBConnectionString" applicationName="TRAQ" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0"
         name="AspNetSqlMemProvider"
         type="System.Web.Security.SqlMembershipProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"
    />
  </providers>
</membership>

No entanto, recebo um erro de tempo de execução dizendo que este assembly não pode ser carregado e acho que é porque tenho o PublicKeyToken errado. Como procuro o PublicKeyToken para minha montagem?

Como alternativa, estou indo totalmente para o lado errado com isso?


Respostas:


282

Usando o PowerShell , você pode executar esta declaração:

([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName

A saída fornecerá a Versão , Cultura e PublicKeyToken, como mostrado abaixo:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

1
Obrigado! seu método é o único que funcionou para mim sn -T dllname.dll só iria mostrar texto de ajuda quando eu corri
Vdex

1
Perfeito! Evita a instalação de ferramentas extras.
Nirav

1
ótimo! este funciona também quando não há é publicKeyToken disponível (isto é, conjuntos de não assinados.)
MovGP0

2
No C # Interactive, você pode chamar: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh 1/11

2
Irritantemente, o PowerShell.exe mantém um bloqueio na DLL, mesmo após a chamada ser concluída. Eu precisava fechar o console do PowerShell antes de poder criar minha solução novamente.
Cee McSharpface

141

Usando o utilitário sn.exe :

sn -T YourAssembly.dll

ou carregando a montagem no Refletor .


31
O sn.exe normalmente pode ser encontrado em um dos seguintes locais em C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows: C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools
david.barkhuizen

Lembre-se, a chave diferencia maiúsculas de minúsculas. -t (letra minúscula) exibirá a mensagem "Falha ao converter chave em token - chave pública de montagem inválida", que fará com que você procure na direção errada.
access_granted 18/04

31

Se você tiver adicionado a DLL ao seu projeto, poderá abrir o arquivo csproj e ver a marca de referência.

Exemplo:

<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

23

sn -T <assembly>na linha de comando do Visual Studio. Se um assembly estiver instalado no cache global, é mais fácil C:\Windows\assemblyencontrá-lo na lista de assemblies do GAC.

No seu caso específico, você pode estar misturando o nome completo do tipo com a referência de montagem; talvez queira dar uma olhada no MSDN .


8

A resposta é muito simples, use as ferramentas do .NET Framework sn.exe. Portanto, abra o prompt de comando do Visual Studio 2008 e aponte para a pasta da DLL que deseja obter a chave pública,

Use o seguinte comando,

sn –T myDLL.dll

Isso fornecerá o token de chave pública. Lembre-se de uma coisa que só funciona se a montagem tiver que ser fortemente assinada.

Exemplo

C: \ WINNT \ Microsoft.NET \ Framework \ v3.5> sn -T EdmGen.exe

Microsoft (R) .NET Framework Strong Name Utility versão 3.5.21022.8
Direitos autorais (c) Microsoft Corporation. Todos os direitos reservados.

O token de chave pública é b77a5c561934e089

Se você tiver Visual Studio 2013 e você não consegue encontrar "desenvolvedor Command Prompt para VS2013" Vai ter um olhar aqui como corrigi-lo: stackoverflow.com/a/22702405/187650
jufo

Observe que esta ferramenta não vem com o Windows.
21719 Ian Boyd

4

Eu uso o Windows Explorer, navegue até C: \ Windows \ assembly, localize o que eu preciso. Nas propriedades, você pode copiar o PublicKeyToken.

Isso não depende do Visual Studio ou de qualquer outro utilitário instalado.


3

Apenas adicionando mais informações, não consegui encontrar o utilitário sn.exe nos locais mencionados, no meu caso, estava em C: \ Arquivos de Programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


Se você abrir um prompt de comando do visual studio, ele deverá estar no seu caminho.
Nattrass 20/10


2

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll"). Nome completo

Vai resultar em

System.Data, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = b77a5c561934e089


1

Como o @CRice disse, você pode usar o método abaixo para obter uma lista de assembly dependente com publicKeyToken

public static int DependencyInfo(string args) 
{
    Console.WriteLine(Assembly.LoadFile(args).FullName);
    Console.WriteLine(Assembly.LoadFile(args).GetCustomAttributes(typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).SingleOrDefault());
    try {
        var assemblies = Assembly.LoadFile(args).GetReferencedAssemblies(); 

        if (assemblies.GetLength(0) > 0)
        {
            foreach (var assembly in assemblies)
            {
                Console.WriteLine(" - " + assembly.FullName + ", ProcessorArchitecture=" + assembly.ProcessorArchitecture);             
            }
            return 0;
        }
    }
    catch(Exception e) {
        Console.WriteLine("An exception occurred: {0}", e.Message);
        return 1;
    } 
    finally{}

    return 1;
}

Eu geralmente uso como um script LinqPad, você pode chamá-lo como

DependencyInfo("@c:\MyAssembly.dll"); do código


0

Você também pode verificar seguindo o método

Vá para Executar: digite o caminho da DLL para o qual você precisa de chave pública. Você encontrará 2 arquivos: 1. __AssemblyInfo_.ini 2. Arquivo DLL

Abra este arquivo __AssemblyInfo_.ini no bloco de notas, aqui você pode ver Public Key Token.

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.