Come trovo il PublicKeyToken per una particolare DLL?


197

Devo ricreare un provider nel mio file web.config che assomigli a questo:

<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>

Tuttavia, viene visualizzato un errore di runtime che indica che questo assembly non può essere caricato e penso che sia perché ho il PublicKeyToken sbagliato. Come cerco il PublicKeyToken per il mio assembly?

In alternativa, sto andando completamente nel modo sbagliato con questo?


Risposte:


282

Utilizzando PowerShell , è possibile eseguire questa istruzione:

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

L'output fornirà Version , Culture e PublicKeyToken come mostrato di seguito:

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

1
Grazie! il tuo metodo è l'unico che ha funzionato per me sn -T dllname.dll mostrerebbe il testo di aiuto solo quando l'ho eseguito
Vdex

1
È perfetto! Evita l'installazione di strumenti extra.
nirav,

1
grande! funziona anche quando non è disponibile PublicKeyToken (es. assiemi non firmati)
MovGP0

2
In C # Interactive è possibile chiamare: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh,

2
In modo fastidioso, PowerShell.exe mantiene un blocco sulla dll anche dopo il completamento della chiamata. Prima di poter costruire di nuovo la mia soluzione avevo bisogno di chiudere la console di PowerShell.
Cee McSharpface,

141

Utilizzando l' utilità sn.exe :

sn -T YourAssembly.dll

o caricando il gruppo in Reflector .


31
Di solito sn.exe si trova in una delle seguenti posizioni in C: \ Programmi (x86) \ Microsoft SDKs \ Windows: C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools
david.barkhuizen

Intendiamoci, la chiave è sensibile al maiuscolo / minuscolo. -t (lettere minuscole) fornirà il "Impossibile convertire la chiave in token - Chiave pubblica assembly non valida.", che ti invierà la ricerca nella direzione sbagliata.
access_granted

31

Se hai aggiunto la DLL al tuo progetto, puoi aprire il file csproj e vedere il tag di riferimento.

Esempio:

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

23

sn -T <assembly>nella riga di comando di Visual Studio. Se un assembly è installato nella Global Assembly Cache, è più facile andare a C:\Windows\assemblytrovarlo nell'elenco degli assembly GAC.

Nel tuo caso specifico, potresti mescolare il nome completo del tipo con il riferimento dell'assembly, potresti dare un'occhiata a MSDN .


8

La risposta è molto semplice usare gli strumenti di .NET Framework sn.exe. Quindi apri il prompt dei comandi di Visual Studio 2008 e quindi punta alla cartella della dll che vuoi ottenere la chiave pubblica,

Usa il seguente comando,

sn –T myDLL.dll

Questo ti darà il token di chiave pubblica. Ricorda una cosa che funziona solo se l'assembly deve essere fortemente firmato.

Esempio

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

Microsoft (R). NET Framework Strong Name Utility Versione 3.5.21022.8
Copyright (c) Microsoft Corporation. Tutti i diritti riservati.

Il token di chiave pubblica è b77a5c561934e089

Se si dispone di Visual Studio 2013 e non è possibile trovare "Sviluppatore Prompt dei comandi per VS2013" andare a dare un'occhiata qui come risolvere il problema: stackoverflow.com/a/22702405/187650
Jufo

Si noti che questo strumento non viene fornito con Windows.
Ian Boyd,

4

Uso Windows Explorer, cerco C: \ Windows \ assembly, trovo quello di cui ho bisogno. Da Proprietà è possibile copiare PublicKeyToken.

Ciò non dipende dall'installazione di Visual Studio o di altre utilità.


3

Aggiungendo ulteriori informazioni, non sono riuscito a trovare l'utilità sn.exe nelle posizioni menzionate, nel mio caso era in C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


Se apri un prompt dei comandi di Visual Studio, questo dovrebbe essere sul tuo percorso.
Nattrass,


2

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

Ne risulterà

System.Data, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089


1

Come ha detto @CRice, è possibile utilizzare il metodo seguente per ottenere un elenco di assembly dipendenti con 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;
}

generalmente lo uso come uno script LinqPad che puoi chiamare come

DependencyInfo("@c:\MyAssembly.dll"); dal codice


0

Puoi anche controllare con il seguente metodo.

Vai a Esegui: digita il percorso della DLL per cui hai bisogno della chiave pubblica. Troverai 2 file: 1. __AssemblyInfo_.ini 2. File DLL

Apri questo file __AssemblyInfo_.ini nel blocco note, qui puoi vedere Token chiave pubblica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.