获取.Net 程序集的 PublicKeyToken

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

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

如果扩展可用,则使用 VisualStudio2010。

184117 次浏览

打开命令提示符并根据 VisualStudio 版本和操作系统体系结构键入下列行之一:

VS 2008 on 32 bit Windows :

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

VS 2008在64位 Windows 上的应用:

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

VS 2010 on 32 bit Windows:

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

VS 2010 on 64 bit Windows:

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

VS 2012 on 32 bit Windows:

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

VS 2012 on 64 bit Windows:

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

VS 2015在64位 Windows 上的应用:

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

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

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

sn -T <assembly>

其中 <assemblyname>是您感兴趣的程序集的完整文件路径,如果它有空格,则用引号包围。

您可以在 VS 中将其作为外部工具添加,如下所示:
林克

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

            var assemblies =
AppDomain.CurrentDomain.GetAssemblies();




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

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

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

2)要获取任何项目的公钥标记,可以在 Visual Studio 中将 sn.exe 作为外部工具的一部分添加。这些步骤在 这个 Microsoft 链接: 如何: 创建获取程序集公钥的工具中显示

另一个选择:

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

看起来就像

数据,版本 = 6.6.5.0,文化 = 中性, PublicKeyToken = c5687fc88969c44d

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

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

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

标题:

Get PublicKeyToken

命令:

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

(不同版本的路径可能不同)

论点:

-T "$(TargetPath)"

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

你可以通过 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;
}

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

以下是 MSDN: Https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx

另一种方法是,如果你有反编译器,只要在那里查找,他们通常提供公钥。我已经看过了。网络反射器,Telerik 刚刚反编译和 ILSpy 刚刚反编译他们似乎有公钥令牌显示。

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

当您在程序集的窗口上拖放程序集并在左侧选择被拖放的程序集时,您可以在窗口的右侧看到公钥标记。

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

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

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

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

另一种选择是使用开放源码工具 NuGet 软件包浏览器

来自 Nuget 软件包(。Nupkg)可以检查 PublicKeyToken,或者拖动二进制文件(。在工具中。对于后者,选择第一个“ File-> new”

enter image description here