Как мне найти 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 для моей сборки?

В качестве альтернативы, я иду совершенно неправильно с этим?

Мэтью Джонс
источник
Возможный дубликат получения PublicKeyToken сборок .Net
Майкл Фрейдгейм

Ответы:

284

Используя PowerShell , вы можете выполнить этот оператор:

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

Выходные данные предоставят Version , Culture и PublicKeyToken, как показано ниже:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
danielB
источник
1
Спасибо! Ваш метод - единственный, который работал для меня sn -T dllname.dll будет показывать текст справки только когда я его запустил
Vdex
1
Отлично! Избегает установки дополнительных инструментов.
Нирав
1
здорово! это также работает, когда PublicKeyToken недоступен (т. е. неподписанные сборки)
MovGP0
2
В C # Interactive вы можете вызвать: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Аури Рахимзаде
2
Досадно, что PowerShell.exe сохраняет блокировку библиотеки DLL даже после завершения вызова. Мне нужно было закрыть консоль PowerShell, прежде чем я смог снова построить свое решение.
Cee McSharpface
141

Использование утилиты sn.exe :

sn -T YourAssembly.dll

или загрузка сборки в Reflector .

Дарин димитров
источник
31
Обычно sn.exe можно найти в одном из следующих расположений в папке C: \ Program Files (x86) \ Microsoft SDK \ Windows: C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v7.0A \ Bin, C: \ Program Files (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" />
Zanon
источник
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 (R) .NET Framework версии 3.5.21022.8
Авторское право (c) Microsoft Corporation. Все права защищены.

Токен открытого ключа: b77a5c561934e089
Прасанна Баладжи
источник
Если у вас есть Visual Studio 2013, и вы не можете найти «Командная строка разработчика для VS2013», посмотрите здесь, как это исправить: stackoverflow.com/a/22702405/187650
juFo
Обратите внимание, что этот инструмент не поставляется с Windows.
Ян Бойд
4

Я использую Windows Explorer, перехожу к C: \ Windows \ assembly, нахожу тот, который мне нужен. Из свойств вы можете скопировать PublicKeyToken.

Это не зависит от установки Visual Studio или любых других утилит.

Майк Хани
источник
3

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

Хирам
источник
Если вы откроете командную строку Visual Studio, она должна быть на вашем пути.
Наттрасс
Проверьте это: stackoverflow.com/questions/3045033/…
ThePatelGuy
2

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

Приведет к

System.Data, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089

CRice
источник
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

Вы также можете проверить, используя следующий метод.

Перейти к Run: введите путь к DLL, для которой вам нужен открытый ключ. Вы найдете 2 файла: 1. __AssemblyInfo_.ini 2. Файл DLL

Откройте этот файл __AssemblyInfo_.ini в блокноте, здесь вы можете увидеть токен открытого ключа.

Мохит Верма
источник