如何找到特定dll的PublicKeyToken?


197

我需要在我的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?

另外,我是否会完全错误地这样做呢?


Answers:


282

使用PowerShell,您可以执行以下语句:

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

输出将提供VersionCulturePublicKeyToken,如下所示:

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

1
谢谢!您的方法是唯一对我有用的方法sn -T dllname.dll仅在运行时显示帮助文本
Vdex 2014年

1
那很完美!避免安装额外的工具。
nirav

1
大!当没有PublicKeyToken可用时(例如,未签名的程序集),此方法也有效
MovGP0

2
在C#Interactive中,您可以调用:Console.WriteLine(System.Reflection.Assembly.LoadFile(@“ c:\ some.dll”)。FullName);
Auri Rahimzadeh,2017年

2
令人讨厌的是,即使调用完成后,PowerShell.exe仍会锁定dll。我需要先关闭PowerShell控制台,然后才能再次构建解决方案。
Cee McSharpface '18

141

使用sn.exe实用程序:

sn -T YourAssembly.dll

或将组件加载到Reflector中


31
sn.exe通常可以在C:\ Program Files(x86)\ Microsoft SDKs \ Windows下的以下位置之一找到:C:\ Program Files(x86)\ Microsoft SDKs \ 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 Tools
david.barkhuizen

注意,该键区分大小写。-t(小写)将显示“无法将密钥转换为令牌-无效的程序集公共密钥。”,这将使您向错误的方向搜索。
access_granted

31

如果您已将DLL添加到项目中,则可以打开csproj文件并查看“引用”标记。

例:

<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 2015年

请注意,该工具不是Windows随附的。
伊恩·博伊德

4

我使用Windows资源管理器,导航到C:\ Windows \ assembly,找到我需要的一个。从属性中,您可以复制PublicKeyToken。

这不依赖于Visual Studio或正在安装的任何其他实用程序。



2

Assembly.LoadFile(@“ C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll”)。全名

将导致

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

您也可以通过以下方法进行检查。

转到运行:键入您需要公共密钥的DLL的路径。您将找到2个文件:1. __AssemblyInfo_.ini 2. DLL文件

在记事本中打开此__AssemblyInfo_.ini文件,在这里您可以看到公共密钥令牌。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.