Ottenere il PublicKeyToken degli assiemi .Net


163

Qual è il modo più semplice per trovare il token chiave pubblica di un assembly?

Il modo più semplice a cui riesco a pensare sarebbe un semplice clic destro, ottenere la chiave pubblica, ma questa funzionalità non è presente, forse c'è un'estensione di Visual Studio per quello?

Sto usando Visual Studio 2010, se è disponibile un'estensione.


4
Vedi questo post di Kirk Evans su come ottenere PublicKeyToken di un assembly in Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
Ho appena installato EF6 e onestamente non so nemmeno dove si trovano gli assiemi. Merda come questa richiede ore della mia giornata.
froggythefrog,

Risposte:


228

Aprire un prompt dei comandi e digitare una delle seguenti righe in base alla versione di Visual Studio e all'architettura del sistema operativo:

VS 2008 su Windows a 32 bit :

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

VS 2008 su Windows a 64 bit:

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

VS 2010 su Windows a 32 bit:

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

VS 2010 su Windows a 64 bit:

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

VS 2012 su Windows a 32 bit:

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

VS 2012 su Windows a 64 bit:

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

VS 2015 su Windows a 64 bit:

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

Si noti che per le versioni VS2012 +, l'applicazione sn.exe non è più nel cestino ma in una sottocartella. Si noti inoltre che per 64 bit è necessario specificare la cartella (x86).

Se si preferisce utilizzare il prompt dei comandi di Visual Studio, digitare:

sn -T <assembly> 

dove <assemblyname>è un percorso file completo per l'assembly che ti interessa, circondato da virgolette se ha spazi.

Puoi aggiungerlo come strumento esterno in VS, come mostrato qui:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -per-a-stong-named-assembly.aspx


1
Sì, lo so, sto cercando un modo più semplice, preferibilmente senza lasciare VS
moi_meme,

12
Sostituisci% ProgramFiles% con% ProgramFiles (x86)% se utilizzi un computer a 64 bit.
System.Cats.Lol

1
Per VS2012 è sotto "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Nota sn è nascosto in un ulteriore livello di cartella dopo bin (negli strumenti NETFX 4.0).
GDS

2
Bella risposta elaborata. Per VS2015 dovrebbe essere in% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy

1
Il percorso VS2015 dovrebbe essere v10.0A, non V1.0A
Michael Itzoe,

87

un'altra opzione:

se usi PowerShell, puoi scoprire come:

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

piace

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

e apparirà come

MySql.Data, Versione = 6.6.5.0, Cultura = neutro, PublicKeyToken = c5687fc88969c44d


Fantastico, mi consente di copiare e incollare l'intero risultato direttamente in una configurazione Web se aggiungo manualmente gli assiemi. Grazie!
GJKH,

Ottima risposta, in quanto è possibile ottenere anche la versione (che può essere importante per la risoluzione dei problemi).
sbkrogers,

48

Se la libreria è inclusa nel progetto VS, è possibile controllare il .cprojfile, ad esempio:

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

2
Vedo solo <Riferimento Include = "System.IdentityModel" /> (lo stesso per gli altri asseblies)
FrenkyB,

Non sembra essere molto utile per gli assembly nelle librerie di sistema .NET. ad esempio per System.Configuration si dice solo<Reference Include="System.Configuration" />
Simon Tewsi

Sembra che tutti gli assiemi abbiano lo stesso PublicKeyToken, quindi uno sguardo nella .cprojsembra la soluzione più semplice.
asdf,

14

Se hai incluso l'assemblaggio nel tuo progetto, puoi fare:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

non sta ottenendo il token di chiave pubblica delle DLL nei miei riferimenti. Il tuo metodo ottiene davvero tutte le DLL nei riferimenti di un determinato progetto? grazie
Francis Saul

@FrancisSaul - elencherà solo gli assembly che sono stati CARICATI nella memoria di processo dell'applicazione; per visualizzare i dettagli di un assembly specifico, eseguire prima il codice che fa riferimento a un tipo di tale assembly. Ad esempio, creare una nuova istanza di una classe in quell'assembly.
ToolmakerSteve

Questo è stato il metodo più semplice che ha funzionato per me. Può essere ulteriormente semplificato: eseguire l'applicazione con un set di punti di interruzione. Quando l'esecuzione ferma sul punto di interruzione, nel tipo VS finestra immediata: AppDomain.CurrentDomain.GetAssemblies(). Verranno elencati gli assembly caricati nella finestra immediata, con Version, Culture e PublicKeyToken per ciascuno.
Simon Tewsi,

È anche possibile eseguire in 'C # Interactive' - nessuna compilazione necessaria!
Martedì

13

Puoi ottenerlo facilmente tramite 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;
}

Ho provato il tuo codice ma non funziona. Voglio ottenere il token di chiave pubblica di Stimulsoft.Report.Web.dll che è già nei miei riferimenti. Ho copiato il tuo codice e ho passato il nome della dll ma non funziona. Il mio codice è simile al seguente: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Ovviamente il metodo sta accettando assembly, non un nome di stringa. Potete aiutarmi come usare il vostro metodo?
Francis Saul,

@FrancisSaul Cosa restituisce il metodo, "Nessuno" o un valore errato? Hai deciso che l'assemblea ha davvero un nome sicuro? È possibile verificare in VS nel pannello delle proprietà per il riferimento (Nome sicuro). Puoi anche verificarlo facilmente con la maggior parte dei decompilatori gratuiti come JustDecompile. Se vedi che ha un nome sicuro, esegui il debug del codice e controlla i byte.
Adam Caviness,

Non riesco a eseguire il progetto, dopo aver digitato la stringa di codice s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"), dice che il sovraccarico migliore per il metodo ha argomenti non validi.
Francis Saul,

@FrancisSaul Stai passando un argomento stringa a un metodo che accetta un assembly. Se lo desideri, puoi typeof(YourPreferredTypeInThatAssembly).Assemblyo Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))passarlo al metodo.
Adam Caviness,

Quindi la sintassi sarebbe così. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul

9

Puoi aggiungere questo come strumento esterno a Visual Studio in questo modo:

Titolo:

Get PublicKeyToken

Comando:

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

(Il percorso potrebbe differire tra le versioni)

Argomenti:

-T "$(TargetPath)"

E seleziona l' opzione " Usa finestra di output ".


1
Quando lo selezioni dal Toolsmenu, funzionerà automaticamente su qualsiasi Progetto selezionato in Esplora soluzioni.
Contango,

Ho rinominato il mio comando in Get PublicKeyToken on Solution Explorer Selection.
Contango,

1
Buona risposta! Suggerimento: se si abilita la casella di controllo "Richiedi argomenti", si apre una finestra di dialogo che consente di incollare un percorso al suo interno. Quindi puoi copiare + incollare un percorso di assemly dalla finestra delle proprietà lì per esempio. Questo è stato molto utile per me, soprattutto quando ho dovuto modificare le registrazioni in web.config e non conoscevo un token di chiave pubblica DLL.
Matt,

8

Il modo più semplice per me è usare ILSpy .

Quando si trascina e rilascia l'assieme sulla sua finestra e si seleziona l'assieme rilasciato a sinistra, è possibile vedere il token della chiave pubblica sul lato destro della finestra.

(Penso anche che le versioni più recenti mostreranno anche la chiave pubblica della firma, se mai ne avessi bisogno ... Vedi qui: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234 . Roba buona! ;))


5

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

Nell'esempio sopra, Microsoft SDK risiede in C: \ Programmi \ Microsoft SDKs \ Windows \ v6.0A. Il tuo ambiente potrebbe essere diverso.

2) Per ottenere il token di chiave pubblica di qualsiasi progetto, è possibile aggiungere sn.exe come parte degli strumenti esterni in Visual Studio. I passaggi sono indicati in questo collegamento Microsoft: Procedura: creare uno strumento per ottenere la chiave pubblica di un assembly


Sì, lo so, sto cercando un modo più semplice, preferibilmente senza lasciare VS
moi_meme,


5

In alternativa, puoi anche usare in linqquesto modo -

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

1
Ha chiesto il token di chiave pubblica. Il tuo codice utilizza la chiave pubblica. Dovrebbe essere.GetPublicKeyToken()
Stefan nato il

1

Un metodo alternativo sarebbe se si dispone di decompilatore, basta cercarlo lì, di solito forniscono la chiave pubblica. Ho esaminato .Net Reflector, Telerik Just Decompile e ILSpy appena decompilati sembrano avere il token della chiave pubblica visualizzato.


1

Un'altra opzione è utilizzare lo strumento open source NuGet Package Explorer per questo.

Da un pacchetto Nuget (.nupkg) è possibile controllare PublicKeyToken o trascinare il file binario (.dll) nello strumento. Per quest'ultimo seleziona prima "File -> nuovo"

inserisci qui la descrizione dell'immagine


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.