Как мне найти 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

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

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

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

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, она должна быть на вашем пути.
Наттрасс


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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.