Как мне найти PublicKeyToken для конкретной библиотеки DLL?

Мне нужно воссоздать провайдера в моем файле 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 для моей сборки?

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

10.11.2009 20:23:35
Возможный дубликат получения PublicKeyToken сборок .Net
Michael Freidgeim 2.05.2016 08:09:18
10 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
268
29.08.2018 08:10:26
Спасибо! Ваш метод - единственный, который работал для меня sn -T dllname.dll будет показывать только текст справки, когда я его
Vdex 24.09.2014 08:52:17
Отлично! Избегает установки дополнительных инструментов.
nirav 4.02.2015 10:22:11
Великий! это работает также, когда PublicKeyToken недоступен (т. е. неподписанные сборки)
MovGP0 5.09.2016 13:20:53
В C # Interactive вы можете вызвать: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh 1.11.2017 19:36:17
Досадно, что PowerShell.exe сохраняет блокировку на dll даже после завершения вызова. Мне нужно было закрыть консоль PowerShell, прежде чем я снова смогу построить свое решение.
Cee McSharpface 7.11.2018 17:17:08

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

В вашем конкретном случае вы можете смешивать полное имя типа со ссылкой на сборку, возможно, вы захотите взглянуть на MSDN .

22
10.11.2009 20:40:12

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

sn -T YourAssembly.dll

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

140
10.11.2009 20:27:39
Обычно 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 4.11.2013 10:00:14
Имейте в виду, ключ чувствителен к регистру. -t (в нижнем регистре) выдаст сообщение «Не удалось преобразовать ключ в токен - неверный открытый ключ сборки». Это приведет к поиску в неправильном направлении.
access_granted 18.04.2020 05:05:29

Ответ очень прост, используйте инструменты .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. Все права защищены.

Токен открытого ключа: b77a5c561934e089
7
18.03.2014 16:06:07
Если у вас есть Visual Studio 2013, и вы не можете найти «Командная строка разработчика для VS2013», посмотрите здесь, как это исправить: stackoverflow.com/a/22702405/187650
juFo 30.03.2015 10:48:26
Обратите внимание, что этот инструмент не поставляется с Windows.
Ian Boyd 19.11.2019 18:58:45

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

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

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

0
21.04.2014 07:50:19

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

3
15.10.2014 15:01:16
Если вы откроете командную строку Visual Studio, она должна быть на вашем пути.
Nattrass 20.10.2014 07:01:49
Проверьте это: stackoverflow.com/questions/3045033/…
ThePatelGuy 13.10.2016 20:13:06

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

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

4
4.11.2014 04:07:55

Если у вас есть DLL, добавленная в ваш проект, вы можете открыть файл csproj и увидеть тег Reference.

Пример:

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

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

Приведет к

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

2
26.02.2018 11:26:50

Как сказал @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"); из кода

1
13.03.2019 12:14:43