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

StackOverflow https://stackoverflow.com/questions/1710935

Вопрос

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

Другие советы

С использованием sn.exe полезность:

sn -T YourAssembly.dll

или загрузить сборку в Отражатель.

Если у вас есть библиотека 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"); из кода

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top