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?


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

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 .


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

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 .


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

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.


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


Wenn Sie eine Visual Studio-Eingabeaufforderung öffnen, sollte sie sich auf Ihrem Pfad befinden.
Nattrass


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


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


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.

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.