Получение PublicKeyToken сборок .Net

163

Какой самый простой способ найти открытый ключ-токен сборки?

Самым простым способом, который я могу придумать, будет простой щелчок правой кнопкой мыши, получение открытого ключа, но этой функциональности нет, может быть, для этого есть расширение Visual Studio?

Я использую Visual Studio 2010, если расширение доступно.

moi_meme
источник
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 больше не в bin, а в подпапке. Также обратите внимание, что для 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 -дль-а-Стонг названия-assembly.aspx

digEmAll
источник
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 помещается в один дополнительный уровень папки после bin (в NETFX 4.0 Tools).
GDS
2
Хороший подробный ответ. Для VS2015 он должен быть в папке% ProgramFiles (x86)% \ Microsoft SDK \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ 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">
...
user2341923
источник
2
Я вижу только <Reference Include = "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);
            }
apoorv020
источник
это не получение открытого ключа токена DLL в моих ссылках. Ваш метод действительно получает все dll в ссылках определенного проекта? спасибо
Фрэнсис Сол
@FrancisSaul - в нем будут перечислены только сборки, которые были ЗАГРУЖЕНЫ в память процесса вашего приложения; чтобы увидеть детали для конкретной сборки, сначала запустите код, который ссылается на некоторый тип в этой сборке. Например, создайте новый экземпляр некоторого класса в этой сборке.
ToolmakerSteve
Это был самый простой метод, который работал для меня. Это может быть упрощено далее: Запустите приложение с установленной точкой останова. Когда выполнение приостанавливается на контрольной точке, в типе VS Immediate Window: AppDomain.CurrentDomain.GetAssemblies(). Это будет список загруженных сборок в Immediate Window, с версией, культурой и PublicKeyToken для каждой.
Саймон Тьюси
Также возможно запускать в C # Interactive - компиляция не требуется!
BAB
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 Что возвращает метод, «Нет» или неверное значение? Вы определили, что сборка действительно имеет сильное имя? Вы можете проверить в 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/issues/610#issuecomment-111189234 . Хорошая вещь! ;))

user2173353
источник
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) в инструмент. Для последнего выберите сначала «Файл -> Новый»

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

юлианский
источник