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

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

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


sn -T < Visual Studio命令行中的组装>。 如果在全局程序集缓存中安装了程序集,则更容易转到c:\ windows \程序集并在GAC程序集列表中找到它。

在您的特定情况下,您可能混合了类型全名和程序集引用,您可能需要查看MSDN。


使用sn.exe实用程序:

sn -T YourAssembly.dll

或在Reflector中加载组件。


答案很简单,使用。net框架工具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

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

进入“运行”:输入需要公钥的DLL的路径。 你会发现2个文件: 1. __AssemblyInfo_.ini 2. DLL文件

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


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

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

输出将提供Version、Culture和PublicKeyToken,如下所示:

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" />

汇编。LoadFile(@“C: \ Windows \微软。NET框架v4。0。30319 \等”)。FullName数据系统。

会导致

系统。数据,版本=4.0.0.0,文化=中立, PublicKeyToken = b77a5c561934e089


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


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

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


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

例如,OxyPlot。Wpf:

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

并浏览DLL及其详细信息。

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


把dll-assemblyinfo文件放入$PATH:

#!/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