180

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

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

如果扩展可用,我正在使用 Visual Studio 2010。

4

13 回答 13

240

打开命令提示符并根据您的 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> 

where<assemblyname>是您感兴趣的程序集的完整文件路径,如果它有空格,则用引号括起来。

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

于 2010-06-15T12:31:08.817 回答
98

另外一个选项:

如果您使用 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

于 2014-01-06T11:04:03.093 回答
50

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

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...
于 2014-03-20T12:16:14.313 回答
14

如果您已将程序集包含在您的项目中,您可以执行以下操作:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }
于 2010-06-15T12:32:23.557 回答
14

您可以通过 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;
}
于 2014-12-22T03:47:26.240 回答
10

您可以将其作为外部工具添加到 Visual Studio,如下所示:

标题:

Get PublicKeyToken

命令:

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

(路径可能因版本而异)

论据:

-T "$(TargetPath)"

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

于 2014-11-24T01:13:08.767 回答
8

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

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

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

于 2015-08-18T13:52:54.230 回答
6

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

于 2018-01-26T09:23:50.013 回答
5

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 中的外部工具的一部分。步骤显示在此 Microsoft 链接中:如何:创建工具以获取程序集的公钥

于 2010-06-15T12:51:42.310 回答
5

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

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));
于 2018-01-17T15:55:20.030 回答
3

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

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

在此处输入图像描述

于 2019-10-17T13:52:10.643 回答
1

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

于 2015-04-22T13:56:03.460 回答
0

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

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

于 2015-02-25T14:44:51.447 回答