Jak znaleźć PublicKeyToken dla konkretnej biblioteki DLL?


197

Muszę ponownie utworzyć dostawcę w moim pliku web.config, który wygląda mniej więcej tak:

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

Jednak pojawia się błąd czasu wykonania informujący, że nie można załadować tego zestawu, i myślę, że dzieje się tak, ponieważ mam zły klucz PublicKeyToken. Jak wyszukać PublicKeyToken dla mojego zestawu?

Alternatywnie, czy idę z tym całkowicie niewłaściwie?


Odpowiedzi:


283

Za pomocą programu PowerShell można wykonać następujące polecenie:

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

Dane wyjściowe dostarczą Version , Culture i PublicKeyToken, jak pokazano poniżej:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

1
Dzięki! Twoja metoda jest jedyną, która działała dla mnie sn -T dllname.dll wyświetlałby tekst pomocy tylko wtedy, gdy go uruchomiłem
Vdex 24.09.14

1
To idealne! Unika instalowania dodatkowych narzędzi.
nirav

1
świetny! działa to również wtedy, gdy nie ma dostępnego klucza publicznego (tj. niepodpisanych zestawów)
MovGP0

2
W C # Interactive możesz wywołać: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh

2
Irytujące jest to, że PowerShell.exe utrzymuje blokadę biblioteki DLL nawet po zakończeniu połączenia. Musiałem zamknąć konsolę PowerShell, aby móc ponownie zbudować swoje rozwiązanie.
Cee McSharpface,

141

Za pomocą narzędzia sn.exe :

sn -T YourAssembly.dll

lub ładowanie zestawu w reflektorze .


31
Sn.exe można zwykle znaleźć w jednej z następujących lokalizacji w folderze C: \ Program Files (x86) \ Microsoft SDKs \ Windows: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Narzędzia
david.barkhuizen

Pamiętaj, że w kluczu rozróżniana jest wielkość liter. -t (małe litery) pokaże „Nie udało się przekonwertować klucza na token - Niepoprawny klucz publiczny asemblera.”, który wyśle ​​cię w złym kierunku.
access_granted

31

Jeśli masz bibliotekę DLL dodaną do swojego projektu, możesz otworzyć plik csproj i zobaczyć znacznik Reference.

Przykład:

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

23

sn -T <assembly>w wierszu polecenia Visual Studio. Jeśli zestaw jest zainstalowany w globalnej pamięci podręcznej zestawu, łatwiej jest przejść do C:\Windows\assemblyi znaleźć go na liście zestawów GAC.

W twoim konkretnym przypadku możesz mieszać pełną nazwę typu z odniesieniem do zestawu, możesz rzucić okiem na MSDN .


8

Odpowiedź jest bardzo prosta, użyj narzędzi .NET Framework sn.exe. Więc otwórz wiersz polecenia programu Visual Studio 2008, a następnie wskaż folder dll, w którym chcesz uzyskać klucz publiczny,

Użyj następującego polecenia,

sn –T myDLL.dll

Otrzymasz token klucza publicznego. Pamiętaj, że działa to tylko wtedy, gdy zestaw musi być silnie podpisany.

Przykład

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

Microsoft (R) .NET Framework Strong Name Utility Wersja 3.5.21022.8
Prawa autorskie (c) Microsoft Corporation. Wszelkie prawa zastrzeżone.

Token klucza publicznego to b77a5c561934e089

Jeśli masz program Visual Studio 2013 i nie możesz znaleźć „Wiersza polecenia programisty dla VS2013”, sprawdź tutaj, jak to naprawić: stackoverflow.com/a/22702405/187650
2015

Pamiętaj, że to narzędzie nie jest dostarczane z systemem Windows.
Ian Boyd

4

Używam Eksploratora Windows, przejdź do C: \ Windows \ assembly, znajdź ten, którego potrzebuję. Z właściwości można skopiować PublicKeyToken.

Nie zależy to od zainstalowania programu Visual Studio ani innych narzędzi.


3

Właśnie dodając więcej informacji, nie byłem w stanie znaleźć narzędzia sn.exe we wspomnianych lokalizacjach, w moim przypadku było to w C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


Jeśli otworzysz wiersz polecenia programu Visual Studio, powinien on znajdować się na twojej ścieżce.
Nattrass,


2

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll"). Pełna nazwa

Spowoduje w

System.Data, Wersja = 4.0.0.0, Kultura = neutralny, PublicKeyToken = b77a5c561934e089


1

Jak powiedział @CRice, możesz użyć poniższej metody, aby uzyskać listę zależnego zestawu za pomocą publicKeyToken

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

generalnie używam go jako skryptu LinqPad, który można nazwać jako

DependencyInfo("@c:\MyAssembly.dll"); z kodu


0

Możesz również sprawdzić, wykonując następującą metodę.

Idź do Uruchom: wpisz ścieżkę DLL, dla którego potrzebujesz klucza publicznego. Znajdziesz 2 pliki: 1. __AssemblyInfo_.ini 2. Plik DLL

Otwórz ten plik __AssemblyInfo_.ini w notatniku, tutaj możesz zobaczyć Token klucza publicznego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.