Abrufen des PublicKeyToken von .Net-Assemblys


163

Was ist der einfachste Weg, um das Public-Key-Token einer Assembly zu finden?

Der einfachste Weg, den ich mir vorstellen kann, wäre ein einfacher Rechtsklick auf den öffentlichen Schlüssel, aber diese Funktionalität ist nicht vorhanden. Vielleicht gibt es dafür eine Visual Studio-Erweiterung?

Ich verwende Visual Studio 2010, wenn eine Erweiterung verfügbar ist.


4
Sehen Sie diesen Blog-Beitrag von Kirk Evans, wie Sie PublicKeyToken einer Assembly in Visual Studio erhalten: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
Gerade EF6 installiert und ehrlich gesagt nicht einmal wissen, wo sich die Baugruppen befinden. Mist wie dieser dauert Stunden meines Tages.
Froggythefrog

Antworten:


228

Öffnen Sie eine Eingabeaufforderung und geben Sie eine der folgenden Zeilen entsprechend Ihrer Visual Studio-Version und Betriebssystemarchitektur ein:

VS 2008 unter 32-Bit-Windows :

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

VS 2008 unter 64-Bit-Windows:

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

VS 2010 unter 32-Bit-Windows:

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

VS 2010 unter 64-Bit-Windows:

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

VS 2012 unter 32-Bit-Windows:

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

VS 2012 unter 64-Bit-Windows:

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

VS 2015 unter 64-Bit-Windows:

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

Beachten Sie, dass für die Versionen VS2012 + die Anwendung sn.exe nicht mehr in bin, sondern in einem Unterordner vorhanden ist. Beachten Sie außerdem, dass Sie für 64-Bit den Ordner (x86) angeben müssen.

Wenn Sie die Visual Studio-Eingabeaufforderung bevorzugen, geben Sie einfach Folgendes ein:

sn -T <assembly> 

Wo <assemblyname>ist ein vollständiger Dateipfad zu der Assembly, an der Sie interessiert sind, umgeben von Anführungszeichen, wenn sie Leerzeichen enthält.

Sie können dies als externes Tool in VS hinzufügen, wie hier gezeigt:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -für-einen-starken-benannten-Assembly.aspx


1
Ja, das weiß ich, ich suche nach einem einfacheren Weg, vorzugsweise ohne VS zu verlassen
moi_meme

12
Ersetzen Sie% ProgramFiles% durch% ProgramFiles (x86)%, wenn Sie sich auf einem 64-Bit-Computer befinden.
System.Cats.Lol

1
Für VS2012 ist es unter "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Hinweis sn befindet sich in einer zusätzlichen Ordnerebene nach bin (in NETFX 4.0 Tools).
GDS

2
Schön ausgearbeitete Antwort. Für VS2015 sollte es unter% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy

1
VS2015 Pfad sollte v10.0A sein, nicht V1.0A
Michael Itzoe

87

andere Option:

Wenn Sie PowerShell verwenden, können Sie Folgendes herausfinden:

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

mögen

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

und wird wie aussehen

MySql.Data, Version = 6.6.5.0, Culture = neutral, PublicKeyToken = c5687fc88969c44d


Genial, lässt mich das gesamte Ergebnis kopieren und direkt in eine Webkonfiguration einfügen, wenn ich manuell Assemblys hinzufüge. Vielen Dank!
GJKH

Tolle Antwort, da Sie auch die Version erhalten können (was für die Fehlerbehebung wichtig sein kann).
sbkrogers

48

Wenn die Bibliothek im VS-Projekt enthalten ist, können Sie die .cprojDatei überprüfen , z.

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

2
Ich sehe nur <Reference Include = "System.IdentityModel" /> (dasselbe gilt für andere Asseblies)
FrenkyB

Scheint für Assemblys in den .NET-Systembibliotheken nicht sehr nützlich zu sein. zB für System.Configuration heißt es nur<Reference Include="System.Configuration" />
Simon Tewsi

Es sieht so aus, als hätten alle Baugruppen das gleiche PublicKeyToken, so dass ein Blick in die .cprojscheinbar einfachste Lösung ist.
ASDF

14

Wenn Sie die Baugruppe in Ihr Projekt aufgenommen haben, können Sie Folgendes tun:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

Es wird nicht das öffentliche Schlüssel-Token der DLLs in meinen Referenzen abgerufen. Bekommt Ihre Methode wirklich die gesamte DLL in den Referenzen eines bestimmten Projekts? danke
Francis Saul

@FrancisSaul - Es werden nur Assemblys aufgelistet, die in den Prozessspeicher Ihrer Anwendung geladen wurden. Um Details für eine bestimmte Assembly anzuzeigen, führen Sie zuerst Code aus, der sich auf einen Typ in dieser Assembly bezieht. Erstellen Sie beispielsweise eine neue Instanz einer Klasse in dieser Assembly.
ToolmakerSteve

Dies war die einfachste Methode, die für mich funktioniert hat. Es kann weiter vereinfacht werden: Führen Sie die Anwendung mit einem festgelegten Haltepunkt aus. Wenn die Ausführung am Haltepunkt angehalten wird, geben Sie im VS-Sofortfenster Folgendes ein : AppDomain.CurrentDomain.GetAssemblies(). Dadurch werden die geladenen Assemblys im Direktfenster mit Version, Kultur und PublicKeyToken aufgelistet.
Simon Tewsi

Es ist auch möglich, in 'C # Interactive' zu laufen - keine Kompilierung erforderlich!
bTab

13

Sie können dies einfach über c # erhalten

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

Ich habe Ihren Code ausprobiert, aber er funktioniert nicht. Ich möchte das öffentliche Schlüssel-Token von Stimulsoft.Report.Web.dll erhalten, das bereits in meinen Referenzen enthalten ist. Ich habe Ihren Code kopiert und den Namen der DLL übergeben, aber es funktioniert nicht. Mein Code sieht ungefähr so ​​aus: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Offensichtlich akzeptiert die Methode Assembly, keinen String-Namen. Können Sie mir helfen, wie Sie Ihre Methode anwenden?
Francis Saul

@FrancisSaul Was gibt die Methode "Keine" oder einen falschen Wert zurück? Haben Sie festgestellt, dass die Versammlung tatsächlich einen starken Namen hat? Sie können in VS im Eigenschaftenfenster nach der Referenz (Starker Name) suchen. Sie können dies auch problemlos mit den meisten kostenlosen Dekompilierern wie JustDecompile überprüfen. Wenn Sie einen starken Namen sehen, debuggen Sie den Code und überprüfen Sie die Bytes.
Adam Caviness

Ich kann das Projekt nicht ausführen, nachdem ich die Codezeichenfolge s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web") eingegeben habe. Die beste Überladung für die Methode hat ungültige Argumente.
Francis Saul

@FrancisSaul Sie übergeben ein String-Argument an eine Methode, die eine Assembly benötigt. Sie können typeof(YourPreferredTypeInThatAssembly).Assemblyoder Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))und übergeben das an die Methode, wenn Sie möchten.
Adam Caviness

Die Syntax wäre also so. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll))
Francis Saul

9

Sie können dies als externes Tool zu Visual Studio hinzufügen:

Titel:

Get PublicKeyToken

Befehl:

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

(Pfad kann zwischen Versionen unterschiedlich sein)

Argumente:

-T "$(TargetPath)"

Aktivieren Sie die Option " Ausgabefenster verwenden ".


1
Wenn Sie dies aus dem ToolsMenü auswählen , wird es automatisch für jedes Projekt ausgeführt, das Sie im Projektmappen-Explorer ausgewählt haben.
Contango

Ich habe meinen Befehl in umbenannt Get PublicKeyToken on Solution Explorer Selection.
Contango

1
Gute Antwort! Hinweis: Wenn Sie das Kontrollkästchen "Aufforderung zur Eingabe von Argumenten" aktivieren, wird ein Dialogfeld geöffnet, in das Sie einen Pfad einfügen können. So können Sie dort beispielsweise einen Assemblierungspfad aus dem Eigenschaftenfenster kopieren und einfügen. Das war sehr nützlich für mich, insbesondere wenn ich Registrierungen in der web.config ändern musste und kein öffentliches Schlüssel-Token für DLLs kannte.
Matt

8

Der einfachste Weg für mich ist die Verwendung von ILSpy .

Wenn Sie die Baugruppe per Drag & Drop in das Fenster ziehen und links die abgelegte Baugruppe auswählen, wird das Token für den öffentlichen Schlüssel auf der rechten Seite des Fensters angezeigt.

(Ich denke auch, dass die neueren Versionen auch den öffentlichen Schlüssel der Signatur anzeigen, falls Sie diesen jemals benötigen ... Siehe hier: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234 . Gutes Zeug! ;))


5

1) Der Befehl lautet C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

Im obigen Beispiel befindet sich das Microsoft SDK in C: \ Programme \ Microsoft SDKs \ Windows \ v6.0A. Ihre Umgebung kann unterschiedlich sein.

2) Um das öffentliche Schlüssel-Token eines Ihrer Projekte abzurufen, können Sie sn.exe als Teil Ihrer externen Tools in Visual Studio hinzufügen. Die Schritte werden in diesem Microsoft-Link gezeigt: Gewusst wie: Erstellen eines Tools zum Abrufen des öffentlichen Schlüssels einer Assembly


Ja, das weiß ich, ich suche nach einem einfacheren Weg, vorzugsweise ohne VS zu verlassen
moi_meme

5

Falls jemand nach dem öffentlichen Schlüssel der Assembly gesucht hat (wie ich), funktioniert nicht das Token für den öffentlichen Schlüssel - die Verwendung von sn.exe funktioniert hervorragend, außer dass Sie den Schalter -Tp verwenden müssen , der sowohl den Token für den öffentlichen Schlüssel als auch den Token für den öffentlichen Schlüssel zurückgibt - mehr unter https://msdn.microsoft.com/en-us/library/office/ee539398(v=office.14).aspx .


5

Alternativ können Sie auch so verwenden linq-

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

1
Er fragte nach dem öffentlichen Schlüssel. Ihr Code verwendet den öffentlichen Schlüssel. Es sollte sein.GetPublicKeyToken()
Stefan Geboren

1

Eine alternative Methode wäre, wenn Sie einen Dekompiler haben, schauen Sie einfach dort nach, sie liefern normalerweise den öffentlichen Schlüssel. Ich habe mir .Net Reflector, Telerik Just Decompile und ILSpy Just Decompile angesehen, bei denen anscheinend das Token für den öffentlichen Schlüssel angezeigt wird.


1

Eine weitere Möglichkeit ist die Verwendung des Open-Source-Tools NuGet Package Explorer .

Aus einem Nuget-Paket (.nupkg) können Sie das PublicKeyToken überprüfen oder die Binärdatei (.dll) in das Tool ziehen. Für letztere wählen Sie zuerst "Datei -> neu"

Geben Sie hier die Bildbeschreibung ein


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.