如何为特定的dll找到PublicKeyToken ?

我需要在我的网络中重新创建一个提供者。配置文件看起来像这样:

<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 ?

或者,我是否完全走错了方向?

185483 次浏览

sn -T <assembly>在Visual Studio命令行。 如果一个程序集安装在全局程序集缓存中,则更容易去C:\Windows\assembly并在GAC程序集列表中找到它

在你的特定情况下,你可能混合了类型全名和程序集引用,你可能想看看MSDN

使用sn.exe实用程序:

sn -T YourAssembly.dll

或在反射器中加载程序集。

答案很简单,使用。net框架工具sn.exe。所以打开Visual Studio 2008命令提示符,然后指向你想要获得公钥的dll文件夹,

使用以下命令,

sn –T myDLL.dll

This will give you the public key token. Remember one thing this only works if the assembly has to be strongly signed.

Example

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

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

Go to Run:输入需要公钥的DLL的路径。 你会发现2个文件: 1. __AssemblyInfo_.ini 2. DLL文件< / p >

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

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

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

输出将提供版本文化都必须,如下所示:

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

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

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

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

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

例子:

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

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

会导致

< p >系统。数据,版本=4.0.0.0,文化=中性, 都必须要< / p >

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

< p > 对于MSVC或其他生成的DLL
使用pktextract从`获取publicKeyToken。cer的
https://learn.microsoft.com/en-us/windows/win32/sbscs/pktextract-exe < / p >

详见其他答案:https://stackoverflow.com/a/72190473/12529885

如果你想要在NuGet上发布的东西的令牌,

例如,OxyPlot。Wpf:

https://nuget.info/packages/OxyPlot.Wpf/2.1.0

并浏览DLL及其详细信息。

只要改变nuget pkg名称和版本的url上的任何其他包。

在你的$PATH中放入文件dll-assemblyinfo:

#!/bin/sh


f=$(readlink -f "$1")


{
echo "using System.Reflection;"
echo "Assembly.LoadFile(\"$f\");"
} | csharp

那么Chmod +x

$ dll-assemblyinfo packages/System.Buffers.4.5.1/lib/netstandard2.0/System.Buffers.dll
System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51