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?

Matthew Jones
źródło
Możliwy duplikat pobierania klucza publicznego zestawu .Net
Michael Freidgeim

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
danielB
źródło
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 .

Darin Dimitrov
źródło
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" />
Zanon
źródło
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 .

Joaquim Rendeiro
źródło
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
Prasanna Balajee
źródło
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.

Mike Honey
źródło
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

Hiram
źródło
Jeśli otworzysz wiersz polecenia programu Visual Studio, powinien on znajdować się na twojej ścieżce.
Nattrass,
Sprawdź to: stackoverflow.com/questions/3045033/…
ThePatelGuy,
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

CRice
źródło
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

Vinod Srivastav
źródło
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.

Mohit Verma
źródło