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.


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


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


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

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

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

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


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! ;))


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


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")));

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.


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


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.