Wie finde ich das PublicKeyToken für eine bestimmte DLL?

197

Ich muss in meiner Datei web.config einen Anbieter neu erstellen, der ungefähr so ​​aussieht:

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

Ich erhalte jedoch einen Laufzeitfehler, der besagt, dass diese Assembly nicht geladen werden kann, und ich denke, das liegt daran, dass ich das falsche PublicKeyToken habe. Wie kann ich das PublicKeyToken für meine Assembly nachschlagen?

Oder gehe ich damit völlig falsch?

Matthew Jones
quelle
Mögliches Duplikat von Getting the PublicKeyToken von .Net-Assemblys
Michael Freidgeim

Antworten:

282

Mit PowerShell können Sie folgende Anweisung ausführen:

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

Die Ausgabe enthält die unten gezeigte Version , Kultur und PublicKeyToken :

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
danielB
quelle
1
Vielen Dank! Ihre Methode ist die einzige, die für mich funktioniert hat. sn -T dllname.dll würde nur Hilfetext anzeigen, wenn ich sie ausgeführt habe
Vdex
1
Das ist perfekt! Vermeidet die Installation zusätzlicher Werkzeuge.
Nirav
1
großartig! Dies funktioniert auch, wenn kein PublicKeyToken verfügbar ist (dh nicht signierte Assemblys)
MovGP0
2
In C # Interactive können Sie Folgendes aufrufen: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh
2
Ärgerlicherweise sperrt PowerShell.exe die DLL auch nach Abschluss des Aufrufs. Ich musste die PowerShell-Konsole schließen, bevor ich meine Lösung erneut erstellen konnte.
Cee McSharpface
140

Verwenden des Dienstprogramms sn.exe :

sn -T YourAssembly.dll

oder Laden der Baugruppe in Reflector .

Darin Dimitrov
quelle
31
sn.exe befindet sich normalerweise an einem der folgenden Speicherorte unter C: \ Programme (x86) \ Microsoft SDKs \ Windows: C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0-Tools
david.barkhuizen
Der Schlüssel unterscheidet zwischen Groß- und Kleinschreibung. -t (Kleinbuchstaben) gibt den Fehler "Fehler beim Konvertieren des Schlüssels in Token - Ungültiger öffentlicher Assemblyschlüssel" aus, wodurch Sie in die falsche Richtung suchen.
access_granted
31

Wenn Sie die DLL zu Ihrem Projekt hinzugefügt haben, können Sie die csproj-Datei öffnen und das Referenz-Tag anzeigen.

Beispiel:

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

sn -T <assembly>in der Visual Studio-Befehlszeile. Wenn eine Assembly im globalen Assemblycache installiert ist, ist es einfacher, C:\Windows\assemblysie in der Liste der GAC-Assemblys zu finden.

In Ihrem speziellen Fall mischen Sie möglicherweise den vollständigen Namen des Typs mit der Baugruppenreferenz. Vielleicht möchten Sie sich MSDN ansehen .

Joaquim Rendeiro
quelle
8

Die Antwort ist sehr einfach. Verwenden Sie die .NET Framework-Tools sn.exe. Öffnen Sie also die Eingabeaufforderung von Visual Studio 2008 und zeigen Sie auf den Ordner der DLL, für den Sie den öffentlichen Schlüssel erhalten möchten.

Verwenden Sie den folgenden Befehl:

sn –T myDLL.dll

Dadurch erhalten Sie das Token für den öffentlichen Schlüssel. Denken Sie daran, dass dies nur funktioniert, wenn die Baugruppe stark signiert sein muss.

Beispiel

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

Microsoft (R) .NET Framework-Dienstprogramm für starke Namen Version 3.5.21022.8
Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten.

Das Token für den öffentlichen Schlüssel lautet b77a5c561934e089
Prasanna Balajee
quelle
Wenn Sie Visual Studio 2013 haben und "Developer Command Prompt for VS2013" nicht finden können, lesen
juFo
Beachten Sie, dass dieses Tool nicht mit Windows geliefert wird.
Ian Boyd
4

Ich benutze den Windows Explorer, navigiere zu C: \ Windows \ Assembly und finde den, den ich brauche. Über die Eigenschaften können Sie das PublicKeyToken kopieren.

Dies hängt nicht davon ab, dass Visual Studio oder andere Dienstprogramme installiert werden.

Mike Honey
quelle
3

Wenn ich nur weitere Informationen hinzufüge, konnte ich das Dienstprogramm sn.exe an den genannten Speicherorten nicht finden, in meinem Fall unter C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin

Hiram
quelle
Wenn Sie eine Visual Studio-Eingabeaufforderung öffnen, sollte sie sich auf Ihrem Pfad befinden.
Nattrass
Überprüfen Sie dies: stackoverflow.com/questions/3045033/…
ThePatelGuy
2

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

Wird darin enden, dass

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

CRice
quelle
1

Wie @CRice sagte, können Sie die folgende Methode verwenden, um eine Liste der abhängigen Assemblys mit publicKeyToken abzurufen

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

Ich benutze es im Allgemeinen als LinqPad- Skript, als das Sie es aufrufen können

DependencyInfo("@c:\MyAssembly.dll"); aus dem Code

Vinod Srivastav
quelle
0

Sie können dies auch mit der folgenden Methode überprüfen.

Gehen Sie zu Ausführen: Geben Sie den Pfad der DLL ein, für die Sie einen öffentlichen Schlüssel benötigen. Sie finden 2 Dateien: 1. __AssemblyInfo_.ini 2. DLL-Datei

Öffnen Sie diese Datei __AssemblyInfo_.ini im Editor. Hier sehen Sie das Token für den öffentlichen Schlüssel.

Mohit Verma
quelle