找到程序集的Public-Key-Token的最简单方法是什么?
我能想到的最简单的方法是简单的右键单击,获取公钥,但是这个功能不存在,可能有一个Visual Studio扩展吗?
我正在使用Visual Studio 2010,如果有可用的扩展名。
答案 0 :(得分:208)
打开命令提示符,然后根据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>
其中<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
答案 1 :(得分:75)
另一种选择:
如果您使用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,Version = 6.6.5.0,Culture = neutral, 公钥= c5687fc88969c44d
答案 2 :(得分:42)
如果该库包含在VS项目中,您可以检查.cproj
文件,例如:
<ItemGroup>
<Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...
答案 3 :(得分:13)
如果您已在程序中包含程序集,则可以执行以下操作:
var assemblies =
AppDomain.CurrentDomain.GetAssemblies();
foreach (var assem in assemblies)
{
Console.WriteLine(assem.FullName);
}
答案 4 :(得分:13)
您可以通过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;
}
答案 5 :(得分:9)
您可以将此作为外部工具添加到Visual Studio中,如下所示:
<强>标题强>
Get PublicKeyToken
<强>命令:强>
c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe
(路径可能因版本而异)
<强>参数:强>
-T "$(TargetPath)"
然后检查&#34; 使用输出窗口&#34;选项。
答案 6 :(得分:7)
对我来说最简单的方法是使用ILSpy。
当你拖动&amp;将程序集放在其窗口上并选择左侧的删除程序集,您可以在窗口右侧看到公钥标记。
(我也认为较新的版本也会显示签名的公钥,如果你需要那个......请看这里:https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234。好东西!;))
答案 7 :(得分: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)要获取任何项目的公钥标记,可以在Visual Studio中添加sn.exe作为外部工具的一部分。这些步骤显示在this Microsoft link: How to: Create a Tool to Get the Public Key of an Assembly
中答案 8 :(得分:2)
作为替代方案,您也可以像这样使用linq
-
string key = string.Join ("",assembly
.GetName()
.GetPublicKeyToken()
.Select (b => b.ToString ("x2")));
答案 9 :(得分:2)
如果有人正在寻找程序集公钥(比如我),而不是公钥标记 - 使用sn.exe工作得很好,除非您必须使用 -Tp 切换,它将返回公钥和公钥标记 - 更多信息来自https://msdn.microsoft.com/en-us/library/office/ee539398(v=office.14).aspx。
答案 10 :(得分:1)
另一种方法是,如果你有反编译器,只需在那里查找,它们通常提供公钥。我看过.Net Reflector,Telerik Just Decompile和ILSpy只是反编译它们似乎显示了公钥标记。
答案 11 :(得分:0)
您可以使用Ildasm.exe(IL反汇编程序)检查程序集的元数据,其中包含完全限定名称。
以下MSDN: https://msdn.microsoft.com/en-us/library/2exyydhb(v=vs.110).aspx
答案 12 :(得分:0)
另一种选择是为此使用开源工具NuGet Package Explorer。
从Nuget包(.nupkg)中,您可以检查PublicKeyToken,或将二进制文件(.dll)拖动到工具中。对于后者,请选择第一个“文件->新”