如何查找程序集的完全限定名称?

54

如何查找我的程序集的完全限定名称,例如:

MyNamespace.MyAssembly, version=1.0.3300.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089

我已经使用SDK中的sn.exe获取了我的PublicKeyToken,但我想轻松地获取完全限定名称。

10个回答

151

这是一个不道德的从I Note It Down复制粘贴的内容,它提供了一种简单的方法来获取项目输出的FQN:

Open Visual Studio
Go to Tools –> External Tools –> Add
    Title: Get Qualified Assembly Name
    Command: Powershell.exe
    Arguments: -command "[System.Reflection.AssemblyName]::GetAssemblyName(\"$(TargetPath)\").FullName"
    Check "Use Output Window".

新工具出现在“工具->获取合格的程序集名称”下。当选择该菜单项时,程序集名称将在输出窗口中给出。

11
微软,时间是2015年。请为我们提供一个更好的选择来获取完全限定的程序集名称。 - vijayst
2
这应该是所选答案。 - M3579
2
支持 @M3579 的评论,给予一些奖励。 - Etheryte
1
这是检查它最方便的方式! - tomalone
这个问题没有明确说明“针对当前项目”。我怀疑作者想要任何程序集,包括依赖项。 - Chris Bordeman

35
如果您可以将程序集加载到.NET应用程序中,则可以执行以下操作:
typeof(SomeTypeInTheAssembly).Assembly.FullName

如果您无法找到它,那么您可以使用ildasm.exe,它会在其中某个地方:

ildasm.exe MyAssembly.dll /text

实际上,这会给你SomeTypeInTheAssembly所在的程序集,而这可能在编译时不可用。 - Dave Van den Eynde
14
我不确定“in there somewhere”是否算得上是一个答案。那个ildasm命令会生成一堵文字墙,格式不太好。下面几条建议更为完整。 - Michael Blackburn
你可以搜索输出中的“MyAssembly, Version=”来找到它。如果你已经安装了grep:ildasm.exe MyAssembly.dll /text | grep -A 1 "MyAssembly, Version=" - NotDan
很不幸,当汇编代码被混淆时,使用ildasm.exe的解决方案将无法起作用。 - Patrick
3
ildasm.exe MyAssembly.dll /text的文本中,没有完整的程序集名称。这种方法是误导和不准确的。 - Puterdo Borato

26

虽然有点晚了,但我搜索了一些关于这个问题的资料,并找到了这个页面:

他描述了一个可以解决此问题的PowerShell函数。所以,我从未使用过PowerShell,但我想尝试一下:

C:\> cd PATH_TO_ASSEMBLY   
C:\PATH_TO_ASSEMBLY>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\PATH_TO_ASSEMBLY> [System.Reflection.AssemblyName]::GetAssemblyName('System.Data.SQLite.dll').FullName
System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
PS C:\PATH_TO_ASSEMBLY>

这段代码实现了其他答案中提到的技巧,但您无需创建项目即可在提示符处键入 ;)


谢谢!使用C#版本的AssemblyName.GetAssemblyName(assemblyPath).FullName结束。 - SuperOli
建议使用程序集名称的完整路径,而不仅仅是程序集名称。顺便说一句,如果你按照那种方式给出,即使你在程序集所在的同一目录中,它也不起作用。 - Soundararajan

9

6
您可以使用开源ILSpy,加载程序集后,它的完整名称将显示在代码窗口顶部的注释中。

6

如果你正在寻找已经在GAC中的程序集的完全限定名称,你可以启动Visual Studio命令提示符(设置正确路径的最简单方法),并使用gacutil /l列出所有程序集及其相应的FQN。使用gacutil /l <yourassemblyname>来过滤列表,更容易找到你要查找的内容。


5

如果您在Reflector中加载程序集(DLL,EXE等),底部会显示完整的强名称。


2
这个回答不合适,他并没有要求使用一个价值118美元的插件来找到这个问题的答案。 - md1337
6
发布时,Reflector是免费的。 - Richard Slater
4
ILSpy是Reflector的免费替代品,可用于查找程序集的完全限定名称。 - Jaanus Varus
1
旧版的 .Net Reflector 6.8.2.5 是免费的,并且它可以正常工作。 - Maxim
现在,dotPeek(由JetBrains开发)是这个目的下最好的免费替代品。 - AlexMelw
dotPeek并不显示完整名称,甚至不显示公钥。 - Chris Bordeman

4

JetBrains的dotPeek或Telerik的JustDecompile都很不错。只需打开DLL,您就可以立即看到名称。


1

1

由于我比较传统,更喜欢使用命令提示符而非PowerShell,因此我编写了这个批处理脚本:

@REM fqn.bat <dll_path>
powershell -command "([system.reflection.assembly]::loadfile('%~f1')).FullName"

%~f1会将第一个参数扩展为绝对路径,因此运行:

fqn mydll.dll 

将打印出您想要的完全限定名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接