2010-06-15 18 views
120

Was ist der einfachste Weg, den Public Key Token einer Assembly zu finden?Abrufen des PublicKeyToken von .Net-Assemblies

Die einfachste Möglichkeit, die ich mir vorstellen kann, wäre ein einfacher Rechtsklick, öffentlicher Schlüssel, aber diese Funktionalität ist nicht da, vielleicht gibt es eine VS Extension dafür.

Ich verwende VS2010, wenn eine Erweiterung

+4

In diesem Blogbeitrag von Kirk Evans erfahren Sie, wie PublicKeyToken einer Assembly in Visual Studio abgerufen werden kann: http://blogs.msdn.com/b/kaevans/archive/2008/06/18/getting-public-key-token -of-assembly-in-visual-studio.aspx –

+1

Gerade installiert EF6 und ehrlich gesagt nicht einmal, wo die Baugruppen befinden. Mist wie dieser dauert Stunden meines Tages. – froggythefrog

Antwort

173

Öffnen Sie eine Eingabeaufforderung zur Verfügung steht, und geben Sie eine der folgenden Zeilen entsprechend Ihrer Visual Studio-Version und Betriebssystem Architektur:

VS 2008 auf 32-Bit Windows-:

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

VS 2008 auf 64-Bit-Windows-:

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

VS 2010 auf 32-Bit-Windows-:

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

VS 2010 auf 64-Bit-Windows-:

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

VS 2012 auf 32-Bit-Windows-:

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

VS 2012 auf 64-Bit-Windows-:

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

VS 2015 auf 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 +, sn.exe Anwendung nicht mehr in ist, aber in einem Unterordner. Beachten Sie auch, dass Sie für 64-Bit einen (x86) Ordner angeben müssen.

Wenn Sie Visual Studio-Eingabeaufforderung verwenden mögen, geben Sie einfach:

sn -T <assembly> 

wo <assemblyname> ist ein vollständiger Dateipfad zur Montage Sie interessiert sind, in Anführungszeichen, wenn es Leerzeichen enthält.

Sie können dieses Add als externes Tool in VS, wie hier gezeigt:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx

+0

Ja, ich weiß das, ich suche nach einem einfacheren Weg, am liebsten ohne VS –

+0

Ohne bessere Antwort akzeptiere ich deins, thx –

+11

Ersetze% ProgramFiles% durch% ProgramFiles (x86)%, wenn du auf einem 64- Bitmaschine. –

11

Wenn Sie die Montage in Ihrem Projekt aufgenommen haben, können Sie tun:

  var assemblies = 
       AppDomain.CurrentDomain.GetAssemblies(); 


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

es ist nicht Ich erhalte das Public-Key-Token der DLLs in meinen Referenzen. Ist Ihre Methode wirklich alle DLL in den Referenzen eines bestimmten Projekts? Danke –

+0

@FrancisSaul - es wird nur Baugruppen auflisten, die in den Prozessspeicher Ihrer Anwendung geladen wurden; Um Details für eine bestimmte Assembly anzuzeigen, führen Sie zunächst einen Code aus, der auf einen Typ in dieser Assembly verweist. Erstellen Sie beispielsweise eine neue Instanz einer Klasse in dieser Assembly. – ToolmakerSteve

+0

Dies war die einfachste Methode, die für mich funktionierte. Es kann weiter vereinfacht werden: Führen Sie die Anwendung mit einem Breakpoint-Set aus. Wenn die Ausführung des Haltepunkts unterbrochen wird, geben Sie im VS-Direktstartfenster Folgendes ein: 'AppDomain.CurrentDomain.GetAssemblies()'. Dadurch werden die geladenen Assemblys im Direktfenster mit Version, Culture und PublicKeyToken für jedes aufgelistet. –

5

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

In dem obigen Beispiel befindet sich das Microsoft SDK in C: \ Programme \ Microsoft SDKs \ Windows \ v6.0A. Ihre Umgebung kann abweichen.

2) Um das Public-Key-Token eines Ihrer Projekte zu erhalten, können Sie sn hinzufügen.exe als Teil Ihrer externen Tools in Visual Studio. Die Schritte sind in this Microsoft link: How to: Create a Tool to Get the Public Key of an Assembly

+0

Ja, ich weiß, ich suche nach einem einfacheren Weg, vorzugsweise ohne VS –

0

Diese blog post war sehr hilfreich beim Abrufen des PublicKey (nicht Public Key Token) der Assembly, die erforderlich sein kann, wenn Sie stark benannte Assemblys und StyleCop verwenden.

59

eine weitere Option:

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 

wie

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

und erscheint wie

MySql.Data:

, wenn Sie Powershell verwenden zu können, wie herausfinden können, , Version = 6.6.5.0, Kultur = neutral, PublicKeyToken = c5687fc88969c44d

+0

Awesome, lassen Sie mich kopieren und fügen Sie das gesamte Ergebnis direkt in eine Web-Konfiguration, wenn ich Assemblys manuell hinzufügen. Vielen Dank! – GJKH

31

Wenn die Bibliothek in dem VS-Projekt enthalten ist, können Sie .cproj Datei überprüfen, zB:

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

Danke - das war einfacher als die anderen Ansätze in meinem speziellen Fall. –

+2

Ich sehe nur (dasselbe gilt für andere Assemblies) – FrenkyB

+0

Scheint nicht besonders nützlich für Assemblys in den .NET-Systembibliotheken. zB für System.Configuration heißt es einfach '' –

7

Sie diese als externes Tool Visual Studio wie so hinzufügen:

Titel:

Get PublicKeyToken 

Befehl:

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

(Pfad zwischen den Versionen unterscheiden können)

Argumente:

-T "$(TargetPath)" 

und überprüfen Sie die "Verwenden Ausgabefenster" -Option.

+1

Wenn Sie dies aus dem 'Tools' Menü auswählen, wird es automatisch mit dem Projekt arbeiten, das Sie im Projektmappen Explorer ausgewählt haben. – Contango

+0

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

+0

Gute Antwort! ** Hinweis: ** Wenn Sie das Kontrollkästchen "Nach Argumenten fragen" aktivieren, öffnet sich ein Dialog, in den Sie einen Pfad einfügen können. So könnten Sie beispielsweise einen Assembly-Pfad aus dem Eigenschaftenfenster kopieren und einfügen. Das war sehr nützlich für mich, vor allem, als ich Registrierungen in der web.config ändern musste und kein DLLs-Public-Key-Token kannte. – Matt

9

Sie können dies leicht bekommen über 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; 
} 
+0

Ich habe Ihren Code versucht, aber es funktioniert nicht.Ich möchte das öffentliche Schlüsseltoken von Stimulsoft.Report.Web.dll, das bereits in meinen Referenzen ist, abrufen. 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 und keinen String-Namen. Kannst du mir helfen, deine Methode anzuwenden? –

+0

@FrancisSaul Was gibt die Methode zurück, "None" oder ein falscher Wert? Hast du festgestellt, dass die Versammlung tatsächlich stark benannt ist? Sie können in VS im Eigenschaftenbereich für die Referenz (Strong Name) überprüfen. Sie können dies auch mit den meisten kostenlosen Decompilern wie JustDecompile überprüfen. Wenn Sie feststellen, dass der Name stark ist, debuggen Sie den Code und untersuchen Sie die Bytes. –

+0

Ich kann das Projekt nicht ausführen, nachdem ich die Codekette s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web") eingegeben habe, heißt es, dass die beste Überladung für die Methode ungültige Argumente hat. –

1

Eine alternative Methode wäre, wenn Sie Decompiler haben, schauen Sie nur dort auf, sie in der Regel den öffentlichen Schlüssel zur Verfügung stellen. Ich habe .Net Reflector, Telerik Just Decompile und ILSpy nur dekompiliert, sie scheinen das öffentliche Schlüsseltoken angezeigt zu haben.

7

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

Wenn Sie & ziehen, lassen Sie die Assembly auf ihr Fenster fallen und wählen Sie die verworfene Assembly auf der linken Seite aus. Sie können das öffentliche Schlüsseltoken auf der rechten Seite des Fensters sehen.

(ich denke auch, dass die neueren Versionen werden auch die öffentlichen Schlüssel der Signatur angezeigt werden, wenn Sie jemals brauchen werden, dass man ... Siehe hier:.! https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234 Good stuff;))

3

diese Anweisung ausführen mit Powershell

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

Als Alternative können Sie auch linq wie folgt verwenden -

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