Як знайти PublicKeyToken для конкретного dll?


198

Мені потрібно відтворити постачальника у файлі web.config, який виглядає приблизно так:

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

Однак я отримую помилку виконання, кажучи, що ця збірка не може бути завантажена, і я думаю, це тому, що у мене неправильний PublicKeyToken. Як я шукаю PublicKeyToken для моєї збірки?

Як варіант, я цілком іду неправильним шляхом?


Відповіді:


284

Використовуючи PowerShell , ви можете виконати це твердження:

([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName

Вихід надасть Версію , Культуру та PublicKeyToken, як показано нижче:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

1
Дякую! ваш метод єдиний, який працював для мене sn -T dllname.dll, показуватиме довідковий текст лише тоді, коли я
запускаю

1
Це ідеально! Уникає встановлення додаткових інструментів.
nirav

1
чудово! це працює і тоді, коли PublicKeyToken не доступний (тобто безпідписані збірки)
MovGP0,

2
У C # Interactive ви можете зателефонувати: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh

2
Прикро, PowerShell.exe тримає замок на dll навіть після завершення виклику. Мені потрібно було закрити консоль PowerShell, перш ніж я зможу знову створити своє рішення.
Cee McSharpface

141

Використання утиліти sn.exe :

sn -T YourAssembly.dll

або завантаження збірки в рефлектор .


31
sn.exe зазвичай можна знайти в одному з наступних місць під C: \ Program Files (x86) \ Microsoft SDKs \ Windows: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Файли програми (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Інструменти
david.barkhuizen

Майте на увазі, ключ чутливий до регістру. -t (нижній регістр) дасть "Не вдалося перетворити ключ у маркер - Недійсний відкритий ключ збірки.", який надішле вам пошук у неправильному напрямку.
access_granted

31

Якщо у ваш проект додана DLL, ви можете відкрити файл csproj і побачити тег Reference.

Приклад:

<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

23

sn -T <assembly>у командному рядку Visual Studio. Якщо збірка встановлена ​​в глобальному кеш-складі, простіше перейти до неїC:\Windows\assembly і знайти її в списку збірок GAC.

У вашому конкретному випадку, можливо, ви змішуєте повне ім'я типу з посиланням на збірку, ви можете поглянути на MSDN .


8

Відповідь дуже простий за допомогою інструментів .NET Framework sn.exe . Тож відкрийте командний рядок Visual Studio 2008, а потім вкажіть папку dll, у якій ви хочете отримати відкритий ключ,

Використовуйте таку команду,

sn –T myDLL.dll

Це дасть вам маркер відкритого ключа. Пам'ятайте одне, що це працює лише в тому випадку, якщо збірка повинна бути сильно підписана.

Приклад

C: \ WINNT \ Microsoft.NET \ Framework \ v3.5> sn -T EdmGen.exe

Утиліта сильного імені Microsoft Framework (.) .NET Framework версії 3.5.21022.8
Авторські права (корпорація Майкрософт) Всі права захищені.

Маркер відкритого ключа - b77a5c561934e089

Якщо у вас є Visual Studio 2013 , і ви не можете знайти «Developer Командного рядка для VS2013» йти тут дивіться , як це виправити: stackoverflow.com/a/22702405/187650
ЮФО

Зауважте, що цей інструмент не постачається разом із Windows.
Ян Бойд

4

Я використовую Провідник Windows, перейдіть до C: \ Windows \ Assembly, знайдіть потрібний мені. З Властивості ви можете скопіювати PublicKeyToken.

Це не покладається на встановлену Visual Studio або будь-які інші утиліти.


3

Просто додавши більше інформації, я не зміг знайти утиліту sn.exe у згаданих місцях, у моєму випадку це було в C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


Якщо ви відкриєте візуальне командне вікно студії, воно повинно бути на вашому шляху.
Nattrass


2

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll"). FullName

Це призведе до

System.Data, Версія = 4.0.0.0, Культура = нейтральна, PublicKeyToken = b77a5c561934e089


1

Як сказав @CRice, ви можете скористатися наведеним нижче методом, щоб отримати список залежної збірки з 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;
}

я взагалі використовую його як скрипт LinqPad, який ви можете назвати як

DependencyInfo("@c:\MyAssembly.dll"); з коду


0

Ви також можете перевірити наступним методом.

Перейти до запуску: введіть шлях DLL, для якого вам потрібен відкритий ключ. Ви знайдете 2 файли: 1. __AssemblyInfo_.ini 2. DLL файл

Відкрийте цей файл __AssemblyInfo_.ini в блокноті, тут ви можете побачити маркер відкритого ключа.

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