获取.Net程序集的PublicKeyToken


163

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

我能想到的最简单的方法是简单的右键单击,获取公钥,但是此功能不存在,也许为此提供了Visual Studio扩展?

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


4
请参阅从柯克·埃文斯这个博客帖子如何在Visual Studio中获得的公钥装配:blogs.msdn.com/b/kaevans/archive/2008/06/18/...
马丁Buberl

2
刚刚安装了EF6,说实话甚至都不知道程序集的位置。这样的胡扯花了我一天的时间。
froggythefrog14年

Answers:


228

打开命令提示符,然后根据您的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一个名为assembly.aspx的文件


1
是的,我知道,我正在寻找一种更简单的方法,最好不要离开VS
moi_meme 2010年

12
如果您使用的是64位计算机,则将%ProgramFiles%替换为%ProgramFiles(x86)%。
System.Cats.Lol 2014年

1
对于VS2012,它位于下"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>。注意bin之后,sn会被夹在一个额外的文件夹级别中(在NETFX 4.0工具中)。
GDS

2
精美的答案。对于VS2015,它应该位于%ProgramFiles(x86)%\ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy 2016年

1
VS2015路径应为v10.0A,而不是V1.0A
Michael Itzoe '17

87

另外的选择:

如果使用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配置中。谢谢!
GJKH 2015年

很好的答案,因为您也可以获得版本(这对于故障排除可能很重要)。
sbkrogers

48

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

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

2
我只看到<Reference Include =“ System.IdentityModel” />(与其他组合相同)
FrenkyB '16

.NET系统库中的程序集似乎用处不大。例如对于System.Configuration它只是说<Reference Include="System.Configuration" />
Simon Tewsi

看起来所有程序集都具有相同的功能PublicKeyToken,因此在其中进行查找.cproj似乎是最简单的解决方案。
asdf

14

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

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


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

它没有在我的参考文件中获取dll的公钥令牌。您的方法是否确实在某个项目的引用中获取了所有dll?谢谢
弗朗西斯·索尔

@FrancisSaul-它只会列出已被加载到应用程序的进程内存中的程序集;要查看特定程序集的详细信息,请首先运行引用该程序集中某种类型的代码。例如,在该程序集中创建某个类的新实例。
制造商

这是最适合我的方法。可以进一步简化:使用断点集运行应用程序。当执行在断点处暂停时,在VS立即窗口中输入:AppDomain.CurrentDomain.GetAssemblies()。这将在立即窗口中列出已加载的程序集,并分别列出版本,区域性和PublicKeyToken。
西蒙·图西

也可以在“ C#Interactive”中运行-无需编译!
bTab

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;
}

我尝试了您的代码,但无法正常工作。我想获取Stimulsoft.Report.Web.dll的公钥令牌,该令牌已在我的参考中。我复制了您的代码,并确实传递了dll的名称,但是它不起作用。我的代码是这样的:string s = GetPublicKeyTokenFromAssembly(“ Stimulsoft.Report.Web”)。显然,该方法正在接受assembly,而不是字符串名称。您能帮我如何使用您的方法吗?
弗朗西斯·索尔

@FrancisSaul方法返回什么,“无”或不正确的值?您是否确定该程序集确实是强命名的?您可以在VS的属性面板上验证引用(强名称)。您还可以使用大多数免费的反编译器(例如JustDecompile)轻松检查此情况。如果您看到它是强名称,请调试代码并检查字节。
亚当·卡维尼斯

在键入代码字符串s = GetPublicKeyTokenFromAssembly(“ Stimulsoft.Report.Web”)之后,我无法运行该项目,它说方法的最佳重载包含无效的参数。
弗朗西斯·索尔

@FrancisSaul您正在将字符串参数传递给采用Assembly的方法。您可以根据需要将 typeof(YourPreferredTypeInThatAssembly).AssemblyAssembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))传递给该方法。
亚当·卡维尼斯

因此语法将是这样的。Assembly.GetAssembly(typeof(“ Stimulsoft.Report.Web.dll));
弗朗西斯·索尔

9

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

标题:

Get PublicKeyToken

命令:

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

(版本之间的路径可能有所不同)

参数:

-T "$(TargetPath)"

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


1
当您从Tools菜单中选择此项时,它将自动在您在解决方案资源管理器中选择的任何项目上运行。
Contango

我将命令重命名为Get PublicKeyToken on Solution Explorer Selection
Contango

1
好答案!提示:如果启用“提示输入参数”复选框,则会打开一个对话框,允许您将路径粘贴到其中。因此,例如,您可以从属性窗口复制+粘贴一条组装路径。这对我来说非常有用,尤其是当我不得不在web.config中更改注册并且不知道DLLs公钥令牌时。
马特


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链接中显示了步骤:如何:创建工具以获取程序集的公钥


是的,我知道,我正在寻找一种更简单的方法,最好不要离开VS
moi_meme 2010年


5

另外,您也可以linq这样使用-

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

1
他要求提供公钥令牌。您的代码使用公钥。应该是.GetPublicKeyToken()
Stefan生于

1

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


1

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

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

在此处输入图片说明


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.