获取.Net程序集的PublicKeyToken [重复]

Posted

技术标签:

【中文标题】获取.Net程序集的PublicKeyToken [重复]【英文标题】:Getting the PublicKeyToken of .Net assemblies [duplicate] 【发布时间】:2011-03-03 23:14:36 【问题描述】:

找到程序集的公钥令牌最简单的方法是什么?

我能想到的最简单的方法是简单的右键单击,获取公钥,但是没有这个功能,也许有一个 Visual Studio 扩展?

我使用的是 Visual Studio 2010,如果有扩展可用的话。

【问题讨论】:

请参阅 Kirk Evans 的这篇博文,了解如何在 Visual Studio 中获取程序集的 PublicKeyToken:blogs.msdn.com/b/kaevans/archive/2008/06/18/… 刚刚安装了 EF6,老实说甚至不知道程序集的位置。像这样的废话需要我一天的时间。 【参考方案1】:

打开命令提示符并根据您的 Visual Studio 版本和操作系统架构键入以下行之一:

32 位 Windows 上的 VS 2008

"%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

64 位 Windows 上的 VS 2008:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

32 位 Windows 上的 VS 2010:

"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

64 位 Windows 上的 VS 2010:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

32 位 Windows 上的 VS 2012:

"%ProgramFiles%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

64 位 Windows 上的 VS 2012:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

64 位 Windows 上的 VS 2015:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exe" -T <assemblyname>

请注意,对于 VS2012+ 版本,sn.exe 应用程序不再位于 bin 中,而是位于子文件夹中。另外,请注意,对于 64 位,您需要指定 (x86) 文件夹。

如果您更喜欢使用 Visual Studio 命令提示符,只需键入:

sn -T <assembly> 

其中&lt;assemblyname&gt; 是您感兴趣的程序集的完整文件路径,如果有空格,则用引号括起来。

您可以在 VS 中将其添加为外部工具,如下所示:http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx

【讨论】:

是的,我知道,我正在寻找一种更简单的方法,最好不要离开 VS 如果您使用的是 64 位计算机,请将 %ProgramFiles% 替换为 %ProgramFiles(x86)%。 对于 VS2012,它位于 "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T &lt;assemblyname&gt; 下。注意 sn 在 bin 之后被隐藏在一个额外的文件夹级别中(在 NETFX 4.0 工具中)。 很好的详细回答。对于 VS2015,它应该在 %ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exeVS2015 路径应该是 v10.0A,而不是 V1.0A【参考方案2】:

另一种选择:

如果你使用 PowerShell,你会发现如下:

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("C:\Program Files (x86)\mysql\Connector NET 6.6.5\Assemblies\v4.0\MySql.Data.dll")).FullName

喜欢

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("dll full path")).FullName

会看起来像

MySql.Data,版本=6.6.5.0,文化=中性, PublicKeyToken=c5687fc88969c44d

【讨论】:

太棒了,如果我手动添加程序集,我可以将整个结果直接复制并粘贴到 Web 配置中。谢谢! 很好的答案,因为您也可以获得版本(这对于故障排除很重要)。【参考方案3】:

如果库包含在VS项目中,可以查看.cproj文件,例如:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...

【讨论】:

我只看到 (其他组件相同) 对于 .NET 系统库中的程序集似乎没有多大用处。例如对于 System.Configuration 它只是说&lt;Reference Include="System.Configuration" /&gt; 看起来所有程序集都有相同的PublicKeyToken,所以在.cproj 中查找似乎是最简单的解决方案。【参考方案4】:

如果您已将程序集包含在您的项目中,您可以这样做:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            
                    Console.WriteLine(assem.FullName);
            

【讨论】:

它没有在我的参考文献中获得 dll 的公钥令牌。您的方法是否真的获取了某个项目的引用中的所有 dll?谢谢 @FrancisSaul - 它只会列出已加载到应用程序进程内存中的程序集;要查看特定程序集的详细信息,首先运行引用该程序集中某些类型的代码。例如,在该程序集中创建某个类的新实例。 这是对我有用的最简单的方法。它可以进一步简化:运行带有断点集的应用程序。当执行在断点处暂停时,在 VS 即时窗口中键入:AppDomain.CurrentDomain.GetAssemblies()。这将在即时窗口中列出加载的程序集,每个程序集都有版本、文化和 PublicKeyToken。 也可以在“C# Interactive”中运行——无需编译!【参考方案5】:

您可以通过 c# 轻松获得此功能

private static string GetPublicKeyTokenFromAssembly(Assembly assembly)

    var bytes = assembly.GetName().GetPublicKeyToken();
    if (bytes == null || bytes.Length == 0)
        return "None";

    var publicKeyToken = string.Empty;
    for (int i = 0; i < bytes.GetLength(0); i++)
        publicKeyToken += string.Format("0:x2", bytes[i]);

    return publicKeyToken;

【讨论】:

我试过你的代码,但它不起作用。我想获取我的参考资料中已经存在的 Stimulsoft.Report.Web.dll 的公钥令牌。我复制了您的代码并传递了 dll 的名称,但它不起作用。我的代码是这样的: string s = GetPublicKeyTokenFromAssembly("Stimulsoft.Report.Web") 。显然,该方法接受程序集,而不是字符串名称。你能帮我如何使用你的方法吗? @FrancisSaul 该方法返回什么,“无”或不正确的值?您确定程序集确实是强命名的吗?您可以在 VS 的属性面板上进行验证以供参考(强名称)。您还可以使用 JustDecompile 等大多数免费反编译器轻松检查这一点。如果您看到它是强命名的,请调试代码并检查字节。 我无法运行项目,在我输入代码字符串 s = GetPublicKeyTokenFromAssembly("Stimulsoft.Report.Web") 后,它说方法的最佳重载具有无效参数。 @FrancisSaul 您正在将字符串参数传递给采用程序集的方法。您可以typeof(YourPreferredTypeInThatAssembly).AssemblyAssembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly)) 并将其传递给您喜欢的方法。 所以语法应该是这样的。 Assembly.GetAssembly(typeof("Stimulsoft.Report.Web.dll));【参考方案6】:

您可以像这样将它作为外部工具添加到 Visual Studio:

标题:

Get PublicKeyToken

命令:

c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe

(路径可能因版本而异)

参数:

-T "$(TargetPath)"

并选中“使用输出窗口”选项。

【讨论】:

当您从Tools 菜单中选择此选项时,它将自动对您在解决方案资源管理器中选择的任何项目进行操作。 我将命令重命名为Get PublicKeyToken on Solution Explorer Selection 好答案! 提示: 如果您启用“提示输入参数”复选框,则会打开一个对话框,允许您将路径粘贴到其中。因此,例如,您可以从那里的属性窗口复制+粘贴一个装配路径。这对我来说非常有用,尤其是当我不得不更改 web.config 中的注册并且不知道 DLL 公钥令牌时。【参考方案7】:

对我来说最简单的方法是使用ILSpy。

当您将程序集拖放到其窗口中并选择左侧已放置的程序集时,您可以在窗口右侧看到公钥令牌。

(我也认为较新的版本也会显示签名的公钥,如果您需要那个...请参见此处:https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234。好东西!;))

【讨论】:

【参考方案8】:

如果有人在寻找程序集 Public Key(比如我),而不是 Public Key Token - 使用 sn.exe 效果很好,除非你必须使用-Tp 开关,这将返回公钥和公钥令牌 - 更多 https://msdn.microsoft.com/en-us/library/office/ee539398(v=office.14).aspx 。

【讨论】:

【参考方案9】:

1) 命令是C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T your.dll

在上述示例中,Microsoft SDK 位于 C:\Program Files\Microsoft SDKs\Windows\v6.0A。您的环境可能不同。

2) 要获取任何项目的公钥令牌,您可以将 sn.exe 添加为 Visual Studio 中的外部工具的一部分。步骤见this Microsoft link: How to: Create a Tool to Get the Public Key of an Assembly

【讨论】:

是的,我知道,我正在寻找一种更简单的方法,最好不要离开 VS【参考方案10】:

作为替代方案,您也可以像这样使用linq -

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));

【讨论】:

他要求提供公钥令牌。您的代码使用公钥。应该是.GetPublicKeyToken()【参考方案11】:

另一种选择是为此使用开源工具NuGet Package Explorer。

您可以从 Nuget 包 (.nupkg) 检查 PublicKeyToken,或将二进制文件 (.dll) 拖到工具中。对于后者,首先选择“File -> new”

【讨论】:

【参考方案12】:

另一种方法是,如果您有反编译器,只需在其中查找它,它们通常会提供公钥。我看过 .Net Reflector、Telerik Just Decompile 和 ILSpy just decompile,它们似乎显示了公钥令牌。

【讨论】:

【参考方案13】:

您可以使用 Ildasm.exe(IL 反汇编程序)检查程序集的元数据,其中包含完全限定名称。

按照 MSDN: https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx

【讨论】:

以上是关于获取.Net程序集的PublicKeyToken [重复]的主要内容,如果未能解决你的问题,请参考以下文章

获取 .NET 程序集的 AssemblyInformationalVersion 值?

获取 .NET 程序集的日期 [重复]

无法加载文件或程序集“System.Net.Http,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”

如何获取代码所在程序集的路径?

如何获取代码所在程序集的路径?

如何获取代码所在程序集的路径?