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

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

Ответ 1

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

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

На выходе будут представлены Version, Culture и PublicKeyToken, как показано ниже:

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

Ответ 2

Используя sn.exe утилита:

sn -T YourAssembly.dll

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

Ответ 3

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

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

Ответ 4

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

Пример:

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

Ответ 5

Ответ очень прост в использовании инструментов .NET Framework sn.exe. Поэтому откройте командную строку Visual Studio 2008 и затем укажите папку dlls, которую вы хотите получить открытым ключом,

Используйте следующую команду:

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

В результате

System.Data, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089

Ответ 9

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

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

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

Ответ 10

Поскольку @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