【问题标题】:How do I find the PublicKeyToken for a particular dll?如何找到特定 dll 的 PublicKeyToken?
【发布时间】:2010-12-15 05:16:16
【问题描述】:

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

或者,我是不是完全走错了路?

【问题讨论】:

标签: .net dll .net-assembly publickeytoken


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!你的方法是唯一对我有用的方法 sn -T dllname.dll 在我运行时只会显示帮助文本
  • 太完美了!避免安装额外的工具。
  • 太棒了!这也适用于没有可用的 PublicKeyToken(即未签名的程序集)
  • 在C# Interactive中,可以调用:Console.WriteLine(System.Reflection.Assembly.LoadFile(@"c:\some.dll").FullName);
  • 令人讨厌的是,即使在调用完成后,PowerShell.exe 也会锁定 dll。我需要关闭 PowerShell 控制台,然后才能再次构建我的解决方案。
【解决方案2】:

正如@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"); 来自代码

【讨论】:

    【解决方案3】:

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

    会导致

    System.Data,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089

    【讨论】:

      【解决方案4】:

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

      例子:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          只是添加更多信息,我无法在上述位置找到 sn.exe 实用程序,在我的情况下,它位于 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin

          【讨论】:

          【解决方案7】:

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

          转到运行:键入您需要公钥的 DLL 的路径。 你会发现 2 个文件: 1. __AssemblyInfo_.ini 2.DLL文件

          在记事本中打开这个__AssemblyInfo_.ini文件,在这里可以看到Public Key Token。

          【讨论】:

            【解决方案8】:

            答案很简单,使用 .NET Framework 工具sn.exe。所以打开Visual Studio 2008 Command Prompt 然后指向你要获取公钥的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) 微软公司。版权所有。
            
            公钥令牌是 b77a5c561934e089

            【讨论】:

            • 如果您有 Visual Studio 2013 并且找不到“VS2013 的开发人员命令提示符”,请查看此处如何修复它:stackoverflow.com/a/22702405/187650
            • 请注意,此工具不随 Windows 提供。
            【解决方案9】:

            sn -T &lt;assembly&gt; 在 Visual Studio 命令行中。 如果程序集安装在全局程序集缓存中,则更容易转到C:\Windows\assembly 并在 GAC 程序集列表中找到它。

            在您的具体情况下,您可能将类型全名与程序集引用混合在一起,您可能想看看MSDN

            【讨论】:

              【解决方案10】:

              使用sn.exe 实用程序:

              sn -T YourAssembly.dll
              

              或在Reflector 中加载程序集。

              【讨论】:

              • 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工具
              • 注意,key 区分大小写。 -t(小写)将给出“无法将密钥转换为令牌--无效的程序集公钥。”,这将使您在错误的方向上进行搜索。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-12
              • 1970-01-01
              • 1970-01-01
              • 2016-03-07
              相关资源
              最近更新 更多