Как мне найти PublicKeyToken для конкретной библиотеки dll?
-
19-09-2019 - |
Вопрос
Мне нужно воссоздать провайдера в моем файле 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 для моей сборки?
С другой стороны, не иду ли я совершенно неправильным путем в этом вопросе?
Решение
С использованием PowerShell, вы можете выполнить этот оператор:
([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName
Результат предоставит Версия, Культура и PublicKeyToken как показано ниже:
MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
Другие советы
Если у вас есть библиотека DLL, добавленная в ваш проект, вы можете открыть файл csproj и увидеть тег Reference.
Пример:
<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
sn -T <assembly>
в командной строке Visual Studio.Если сборка установлена в глобальном кэше сборок, к ней проще перейти C:\Windows\assembly
и найдите его в списке сборок GAC.
В вашем конкретном случае вы, возможно, смешиваете полное имя типа со ссылкой на сборку, возможно, вы захотите взглянуть на MSDN.
Ответ очень прост: используйте инструменты .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 Strong Name Utility Version 3.5.21022.8 Copyright (c) Microsoft Corporation. All rights reserved. Public key token is b77a5c561934e089
Я использую проводник Windows, перехожу к C:\Windows\assembly и нахожу тот, который мне нужен.Из свойств вы можете скопировать PublicKeyToken.
Это не зависит от установки Visual Studio или каких-либо других утилит.
Просто добавив дополнительную информацию, мне не удалось найти утилиту sn.exe в указанных местах, в моем случае она была в C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin.
Сборка.Загрузочный файл (@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\system.data.dll").Полное имя
Приведет к
System.Data, версия=4.0.0.0, Язык интерфейса= нейтральный, PublicKeyToken=b77a5c561934e089
Вы также можете проверить следующим способом.
Перейти к бегству :введите путь к библиотеке DLL, для которой вам нужен открытый ключ.Вы найдете 2 файла :1.__AssemblyInfo_.ini 2.DLL-файл
Откройте этот файл __AssemblyInfo_.ini в блокноте, здесь вы можете увидеть токен открытого ключа.
Как сказал @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");
из кода