Отримання збірок PublicKeyToken з .Net


163

Який найпростіший спосіб знайти публічний ключ-маркер збірки?

Найпростішим способом, який я можу придумати, було б просте клацання правою кнопкою миші, отримати відкритий ключ, але цієї функціональності немає, можливо, для цього є розширення Visual Studio?

Я використовую Visual Studio 2010, якщо є розширення.


4
Дивіться цю публікацію в блозі від Кірка Еванса, як отримати PublicKeyToken зібрання у Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Мартін Буберл

2
Щойно встановлений EF6 і, чесно кажучи, навіть не знаю, де розташовані збори. Таке лайно займає години мого дня.
froggythefrog

Відповіді:


228

Відкрийте командний рядок і введіть один із наступних рядків відповідно до версії Visual Studio та архітектури операційної системи:

VS 2008 для 32-бітної Windows :

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

VS 2008 на 64-бітній Windows:

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

VS 2010 для 32-бітної Windows:

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

VS 2010 на 64-бітній Windows:

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

VS 2012 для 32-бітної Windows:

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

VS 2012 на 64-бітній Windows:

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

VS 2015 на 64-бітній Windows:

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

Зауважте, що для версій VS2012 +, програма sn.exe вже не в біні, а в підпапці. Також зауважте, що для 64-бітної потрібно вказати папку (x86).

Якщо ви віддаєте перевагу використовувати командний рядок Visual Studio, просто введіть:

sn -T <assembly> 

де <assemblyname>повний шлях до файлу, який вас цікавить, в оточенні лапок, якщо в ньому є пробіли.

Ви можете додати це як зовнішній інструмент у VS, як показано тут:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -для a-stong-найменування-Assembly.aspx


1
Так, я знаю, що я шукаю більш простий спосіб, бажано, не виходячи з VS
moi_meme

12
Замініть% ProgramFiles% на% ProgramFiles (x86)%, якщо ви працюєте на 64-розрядній машині.
System.Cats.Lol

1
Для VS2012 він знаходиться нижче "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Примітка sn знаходиться в одному додатковому рівні папки після біна (в інструментах NETFX 4.0).
GDS

2
Приємна розроблена відповідь. Для VS2015 він повинен бути під% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Інструменти \ sn.exe
ThePatelGuy

1
Шлях VS2015 має бути v10.0A, а не V1.0A
Майкл Іцо

87

інший варіант:

якщо ви використовуєте PowerShell, ви можете дізнатися:

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

подібно до

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

і буде виглядати як

MySql.Data, версія = 6.6.5.0, культура = нейтральна, PublicKeyToken = c5687fc88969c44d


Дивовижний, дозволяє мені скопіювати і вставити весь результат прямо у веб-конфігурацію, якщо я додаю збірки вручну. Дякую!
GJKH

Чудова відповідь, оскільки ви можете отримати і версію (що може бути важливо для усунення несправностей).
sbkrogers

48

Якщо бібліотека включена у проект VS, ви можете перевірити .cprojфайл, наприклад:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...

2
Я бачу лише <Посилання включати = "System.IdentityModel" /> (те саме для інших асбелей)
FrenkyB

Здається, це не дуже корисно для складання в системних бібліотеках .NET. наприклад, для System.Configuration просто сказано<Reference Include="System.Configuration" />
Саймон Тевсі

Схоже, всі збірки однакові PublicKeyToken, тому один погляд вгору, .cprojздається, є найпростішим рішенням.
asdf

14

Якщо ви включили збірку у свій проект, ви можете:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }

це не отримує маркер відкритого ключа для DLL у моїх посиланнях. Чи дійсно ваш метод отримує весь dll у посиланнях на певний проект? дякую
Франциск Саул

@FrancisSaul - він буде перераховувати лише збірки, завантажені в процесну пам'ять вашої програми; щоб побачити деталі конкретної збірки, спочатку запустіть код, який посилається на певний тип у цій збірці. Наприклад, створіть новий екземпляр якогось класу в цій збірці.
ToolmakerSteve

Це був найпростіший метод, який працював на мене. Це можна додатково спростити: Запустіть додаток із встановленою точкою перерви. Коли виконання призупиняється на контрольній точці, в типі VS Immediate Window: AppDomain.CurrentDomain.GetAssemblies(). У цьому списку буде перераховано завантажені збірки у Негайному вікні із версіями, культурою та PublicKeyToken для кожного.
Simon Tewsi

Можна також запустити в "C # Interactive" - ​​компіляція не потрібна!
bTab

13

Ви можете легко отримати це за допомогою 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;
}

Я спробував ваш код, але він не працює. Я хочу отримати маркер відкритого ключа Stimulsoft.Report.Web.dll, який вже є в моїх посиланнях. Я скопіював ваш код і передав ім'я DLL, але він не працює. Мій код виглядає приблизно так: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Очевидно, що метод приймає збірку, а не ім'я рядка. Чи можете ви допомогти мені, як використовувати ваш метод?
Франциск Саул

@FrancisSaul Що метод повертає "None" або неправильне значення? Ви визначили, що збірка справді названа сильною? Ви можете перевірити в VS на панелі властивостей для довідки (Сильне ім'я). Ви також можете легко перевірити це за допомогою більшості безкоштовних декомпіляторів, таких як JustDecompile. Якщо ви бачите, що він названий сильним, налагодьте код і огляньте байти.
Адам Порожня

Я не можу запустити проект, після того як я набрала рядок коду s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"), він говорить, що найкраща перевантаження методу має недійсні аргументи.
Франциск Саул

@FrancisSaul Ви передаєте рядовий аргумент методу, який бере збірка. Ви можете typeof(YourPreferredTypeInThatAssembly).Assemblyабо Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))передати це методу, якщо вам подобається.
Адам Порожня

Значить, синтаксис був би таким. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Френсіс Саул

9

Ви можете додати це як зовнішній інструмент до Visual Studio так:

Назва:

Get PublicKeyToken

Команда:

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

(Шлях може відрізнятися між версіями)

Аргументи:

-T "$(TargetPath)"

І встановіть прапорець " Використовувати вихідне вікно ".


1
Коли ви виберете це з Toolsменю, воно автоматично працюватиме з будь-яким проектом, який ви вибрали в Провіднику рішень.
Контанго

Я перейменував свою команду на Get PublicKeyToken on Solution Explorer Selection.
Контанго

1
Хороша відповідь! Підказка: Якщо ви включите прапорець "Запросити аргументи", відкриється діалогове вікно, яке дозволяє вставити шлях до нього. Таким чином, ви можете скопіювати + вставити шлях, наприклад, у вікно властивостей, наприклад. Це було дуже корисно для мене, особливо коли мені довелося змінити реєстрації в web.config і не знав маркер відкритого ключа DLL.
Метт

8

Найпростіший спосіб для мене - використовувати ILSpy .

Коли ви перетягуєте збірку на її вікно та вибираєте збір, що випав, зліва, ви можете побачити маркер відкритого ключа в правій частині вікна.

(Я також думаю, що новіші версії також відображатимуть відкритий ключ підпису, якщо він вам коли-небудь знадобиться ... Дивіться тут: https://github.com/icsharpcode/ILSpy/isissue/610#issuecomment-111189234 . Хороший матеріал! ;))


5

1) Команда є C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

У наведеному вище прикладі Microsoft SDK знаходиться в C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A. Навколишнє середовище може відрізнятися.

2) Щоб отримати маркер відкритого ключа будь-якого вашого проекту, ви можете додати sn.exe як частину своїх зовнішніх інструментів у Visual Studio. Кроки показані в цьому посиланні Microsoft: Як: Створити інструмент для отримання відкритого ключа складання


Так, я знаю, що я шукаю більш простий спосіб, бажано, не залишаючи VS
moi_meme

5

У випадку, якщо хтось шукав асемблерний відкритий ключ (як я), а не маркер відкритого ключа - використання sn.exe чудово працює, за винятком того, що вам потрібно використовувати перемикач -Tp , який поверне токен відкритого ключа та відкритого ключа - більше за адресою https://msdn.microsoft.com/en-us/library/office/ee539398(v=office.14).aspx .


5

Як альтернативу, ви також можете використовувати linqтакий -

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));

1
Він попросив маркер відкритого ключа. Ваш код використовує відкритий ключ. Це повинно бути.GetPublicKeyToken()
Стефан Народився

1

Альтернативний метод був би, якщо у вас є декомпілятор, просто подивіться його там, вони зазвичай надають відкритий ключ. Я переглянув .Net Reflector, Telerik Just Decompile та ILSpy просто декомпілюють, начебто вони відображають маркер відкритого ключа.


1

Інший варіант полягає у використанні інструмента з відкритим кодом NuGet Package Explorer .

З пакета Nuget (.nupkg) ви можете перевірити PublicKeyToken або перетягнути бінарне (.dll) в інструмент. Для останнього виберіть перший "Файл -> новий"

введіть тут опис зображення


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.