Pobieranie PublicKeyToken zestawów .Net

163

Jaki jest najprostszy sposób na znalezienie tokenu klucza publicznego zestawu?

Najprostszym sposobem, o którym mogę pomyśleć, byłoby proste kliknięcie prawym przyciskiem myszy, uzyskanie klucza publicznego, ale tej funkcji nie ma, może jest do tego rozszerzenie Visual Studio?

Używam programu Visual Studio 2010, jeśli jest dostępne rozszerzenie.

moi_meme
źródło
4
Zobacz ten post na blogu Kirka Evansa, jak uzyskać PublicKeyToken zestawu w programie Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl
2
Właśnie zainstalowałem EF6 i szczerze mówiąc nawet nie wiem, gdzie znajdują się zestawy. Takie gówno zajmuje mi wiele godzin.
froggythefrog

Odpowiedzi:

228

Otwórz wiersz polecenia i wpisz jeden z następujących wierszy zgodnie z wersją programu Visual Studio i architekturą systemu operacyjnego:

VS 2008 w 32-bitowym systemie Windows :

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

VS 2008 w 64-bitowym systemie Windows:

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

VS 2010 w 32-bitowym systemie Windows:

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

VS 2010 w 64-bitowym systemie Windows:

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

VS 2012 w 32-bitowym systemie Windows:

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

VS 2012 w 64-bitowym systemie Windows:

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

VS 2015 w 64-bitowym systemie Windows:

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

Zauważ, że w wersjach VS2012 + aplikacja sn.exe nie jest już w bin, ale w podfolderze. Zwróć również uwagę, że w przypadku wersji 64-bitowej musisz określić folder (x86).

Jeśli wolisz używać wiersza polecenia programu Visual Studio, po prostu wpisz:

sn -T <assembly> 

gdzie <assemblyname>jest pełna ścieżka do pliku, który Cię interesuje, ujęta w cudzysłowy, jeśli zawiera spacje.

Możesz dodać to jako narzędzie zewnętrzne w VS, jak pokazano tutaj:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -for-a-stong-named-assembly.aspx

digEmAll
źródło
1
Tak, wiem, szukam łatwiejszej drogi, najlepiej bez wychodzenia z VS
moi_meme
12
Zastąp% ProgramFiles%% ProgramFiles (x86)%, jeśli korzystasz z maszyny 64-bitowej.
System.Cats.Lol
1
W przypadku VS2012 jest pod "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Uwaga sn jest schowana na jednym dodatkowym poziomie folderu za bin (w narzędziach NETFX 4.0).
GDS
2
Niezła, rozbudowana odpowiedź. W przypadku VS2015 powinien znajdować się w% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy
1
Ścieżka VS2015 powinna być w wersji 10.0A, a nie w wersji 1.0A
Michael Itzoe
87

inna opcja:

jeśli używasz PowerShell, możesz dowiedzieć się, jak:

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

lubić

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

i będzie wyglądać jak

MySql.Data, wersja = 6.6.5.0, Culture = neutral, PublicKeyToken = c5687fc88969c44d

Mujah Maskey
źródło
Niesamowite, pozwala mi skopiować i wkleić cały wynik bezpośrednio do konfiguracji internetowej, jeśli ręcznie dodam zestawy. Dzięki!
GJKH
Świetna odpowiedź, ponieważ możesz również pobrać wersję (co może być ważne przy rozwiązywaniu problemów).
sbkrogers
48

Jeśli biblioteka jest uwzględniona w projekcie VS, możesz sprawdzić .cprojplik, np:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...
user2341923
źródło
2
Widzę tylko <Reference Include = "System.IdentityModel" /> (to samo dla innych asseblies)
FrenkyB
Wydaje się, że nie jest zbyt użyteczny dla zestawów w bibliotekach systemowych .NET. np. dla System.Configuration to po prostu mówi<Reference Include="System.Configuration" />
Simon Tewsi
Wygląda na to, że wszystkie złożenia mają to samo PublicKeyToken, więc jedno spojrzenie w górę .cprojwydaje się być najłatwiejszym rozwiązaniem.
asdf
14

Jeśli umieściłeś zespół w swoim projekcie, możesz wykonać:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }
apoorv020
źródło
nie uzyskuje tokenu klucza publicznego biblioteki DLL w moich referencjach. Czy Twoja metoda naprawdę pobiera całą bibliotekę dll w referencjach określonego projektu? dzięki
Francis Saul
@FrancisSaul - wyświetli tylko listę zestawów, które zostały ZAŁADOWANE do pamięci procesu aplikacji; aby zobaczyć szczegóły konkretnego zestawu, najpierw uruchom kod, który odwołuje się do jakiegoś typu w tym zestawie. Na przykład utwórz nowe wystąpienie jakiejś klasy w tym zestawie.
ToolmakerSteve,
To była najprostsza metoda, która zadziałała. Można to jeszcze bardziej uprościć: Uruchom aplikację z ustawionym punktem przerwania. Gdy zatrzymuje się na wykonanie przerwania, w rodzaju VS oknie Immediate: AppDomain.CurrentDomain.GetAssemblies(). Spowoduje to wyświetlenie załadowanych zestawów w oknie bezpośrednim, z wersją, kulturą i tokenem PublicKeyToken dla każdego.
Simon Tewsi
Możliwe jest również uruchomienie w 'C # Interactive' - bez kompilacji!
bTab
13

Możesz to łatwo uzyskać za pomocą 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;
}
Adam Caviness
źródło
Wypróbowałem twój kod, ale nie działa. Chcę uzyskać token klucza publicznego Stimulsoft.Report.Web.dll, który jest już w moich plikach referencyjnych. Skopiowałem twój kod i przekazałem nazwę dll, ale nie działa. Mój kod wygląda mniej więcej tak: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Oczywiście metoda akceptuje zestaw, a nie nazwę ciągu. Czy możesz mi pomóc, jak używać swojej metody?
Francis Saul
@FrancisSaul Co zwraca metoda - „None” lub nieprawidłowa wartość? Czy ustaliłeś, że nazwa zgromadzenia jest naprawdę mocna? Możesz sprawdzić w VS w panelu właściwości dla odniesienia (silna nazwa). Możesz to również łatwo sprawdzić za pomocą większości darmowych dekompilatorów, takich jak JustDecompile. Jeśli widzisz, że ma silną nazwę, zdebuguj kod i sprawdź bajty.
Adam Caviness
Nie mogę uruchomić projektu, po wpisaniu ciągu kodu s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web") mówi, że najlepsze przeciążenie metody ma nieprawidłowe argumenty.
Francis Saul
@FrancisSaul Przekazujesz argument w postaci ciągu do metody, która przyjmuje Assembly. Możesz typeof(YourPreferredTypeInThatAssembly).Assemblylub Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))i przekazać to do metody, jeśli chcesz.
Adam Caviness
Więc składnia wyglądałaby następująco. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul,
9

Możesz dodać to jako narzędzie zewnętrzne do programu Visual Studio w następujący sposób:

Tytuł:

Get PublicKeyToken

Komenda:

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

(Ścieżka może się różnić w zależności od wersji)

Argumenty:

-T "$(TargetPath)"

I zaznacz opcję „ Użyj okna wyjściowego ”.

Danny Varod
źródło
1
Po wybraniu tego z Toolsmenu będzie automatycznie działać na dowolnym projekcie wybranym w Eksploratorze rozwiązań.
Contango,
Zmieniłem nazwę mojego polecenia na Get PublicKeyToken on Solution Explorer Selection.
Contango
1
Dobra odpowiedź! Wskazówka: jeśli zaznaczysz pole wyboru „Pytaj o argumenty”, otworzy się okno dialogowe umożliwiające wklejenie do niego ścieżki. Możesz więc skopiować i wkleić ścieżkę montażową z okna właściwości, na przykład. Było to dla mnie bardzo przydatne, zwłaszcza gdy musiałem zmienić rejestracje w web.config i nie znałem tokenu klucza publicznego DLL.
Matt
8

Najprostszym sposobem jest dla mnie użycie ILSpy .

Po przeciągnięciu i upuszczeniu zestawu do jego okna i wybraniu upuszczonego zestawu po lewej stronie można zobaczyć token klucza publicznego po prawej stronie okna.

(Myślę też, że nowsze wersje będą również wyświetlać klucz publiczny podpisu, jeśli kiedykolwiek będziesz go potrzebować ... Zobacz tutaj: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234 . Dobry towar! ;))

user2173353
źródło
5

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

W powyższym przykładzie Microsoft SDK znajduje się w C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A. Twoje środowisko może się różnić.

2) Aby uzyskać token klucza publicznego dowolnego projektu, możesz dodać plik sn.exe jako część narzędzi zewnętrznych w programie Visual Studio. Kroki są pokazane w tym łączu Microsoft: Jak: Tworzenie narzędzia do uzyskiwania klucza publicznego zestawu

Syd
źródło
Tak, wiem, szukam łatwiejszej drogi, najlepiej bez wychodzenia z VS
moi_meme
5

Alternatywnie możesz również użyć w linqten sposób -

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));
Jog
źródło
1
Poprosił o token klucza publicznego. Twój kod używa klucza publicznego. Powinno być.GetPublicKeyToken()
Stefan Born
1

Alternatywną metodą byłoby, gdybyś miał dekompilator, po prostu poszukaj go tam, zwykle zapewniają one klucz publiczny. Patrzyłem na .Net Reflector, Telerik Just Decompile i ILSpy właśnie dekompilują, wydaje się, że wyświetlany jest token klucza publicznego.

bhupendra patel
źródło
1

Inną opcją jest użycie do tego narzędzia typu open source NuGet Package Explorer .

Z pakietu Nuget (.nupkg) można sprawdzić PublicKeyToken lub przeciągnąć plik binarny (.dll) w narzędziu. W tym drugim przypadku wybierz najpierw „Plik -> nowy”

wprowadź opis obrazu tutaj

juliański
źródło