确定dll所需的.NET Framework版本

180

我有一个旧的dll文件,编译时使用的是.NET Framework,并且已经部署了。但是我不确定它是编译在哪个版本的.NET Framework上的。我想知道如何确定这个dll是针对哪个版本的.NET Framework进行编译的?我不能依赖源代码,因为我认为它已经升级到Visual Studio 2008并更改为.NET Framework版本3.5。


4
可能是重复的问题,与“如何找出一个可执行文件需要运行的.NET Framework版本?”相关。 - sirdank
15个回答

171
在PowerShell中,您可以使用以下内容获取目标运行时:
$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

我从Ben Griswold的答案中将其转换为PowerShell。

如果您想要知道在Visual Studio中指定的目标框架版本,请使用以下命令:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

你应该得到类似于

.NETFramework,Version = v4.5.2


4
这个答案是最有帮助的。2003年后的所有Windows操作系统都支持Powershell。它是一个可以立即给出反馈的shell,不需要像其他答案中建议的许多额外应用程序的支持。非常适合"一次性"检查dll。 @swoogan 你太棒了。 - Nathan McCoy
2
我为一个TargetFrameworkVersion为v3.5的DLL执行了此操作,但它返回了v2.0.50727。我错过了什么? - BHSPitMonkey
6
@BHSPitMonkey,实际上只有四个运行时版本:1.0、1.1、2.0和4.0。.NET 3.0和3.5编译到CLR版本2.0。https://msdn.microsoft.com/zh-cn/library/bb822049(v=vs.110).aspx - Swoogan
2
这个脚本只提供了RuntimeVersion,问题是关于TargetFrameworkversion的。实际上,对于所有编译为2.0、3.0、3.5的程序集,这个脚本显示的运行时版本都是2.0.0.0。 - Kiran Vedula
4
对我来说,ReflectionOnlyLoadFrom 方法返回 ImageRuntimeVersion 但没有 CustomAttributes。 如果使用 LoadFrom 方法而不是 ReflectionOnlyLoadFrom,则会得到预期的结果。有什么原因吗? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000 - Bernard Vander Beken
显示剩余5条评论

82

dotPeek 是一款非常棒的(免费)工具,用于展示这些信息。

如果您在获取 Reflector 方面遇到了一些问题,那么这是一个很好的替代方案。

输入图像描述


4
FYI,我从使用DotPeek切换到JustDecompile,原因是一个问题:如果你选择"specific version = false",DotPeek会显示一个空版本,而JustDecompile会显示正确的版本。这个问题使我觉得值得去切换。 - ashes999
太棒了 - 恰好做到了我想要的,而不需要安装 Reflector 的试用版。 - bernhardrusch

54

您可以使用ILDASM...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

查看输出中的“元数据部分”。它应该像这样:

元数据部分:0x424a5342,版本:1.1,额外信息:0,版本长度:12,版本:v4.0.30319

通过“version”标签可以查看.NET Framework版本。在以上示例中,版本是4.0.30319。


3
我在这里寻找什么?这是指.NET 4.0吗?// 元数据部分:0x424a5342,版本:1.1,额外信息:0,版本长度:12,版本号:v4.0.30319 - PeterX
是的,对于.NET 2,我得到了以下内容: // 元数据部分:0x424a5342,版本:1.1,额外信息:0,版本长度:12,版本:v2.0.50727 - Simon
但那是CLR版本,不是.NET Framework版本。 - Lex Li

52

将它加载到Reflector中,看看它引用了什么?

例如:

在这里输入图片描述


1
我的想法也是这样,但是知道反射器的话,它可能会抱怨,并显示一个漂亮的不明确的错误图标。 - leppie
@leppie 不应该有问题,即使是 .NET 1.1。只需更改默认程序集列表即可。 - ParmesanCodice
你的回答非常有帮助,但我建议不要盲目依赖它——昨天我花了太多时间在自己的项目上,该项目针对的是.NET 4.0,在Reflector上报告为使用.NET 4.0.3,并且需要Windows使用.NET 4.5 :-) 我不知道除了源代码之外是否有任何验证此问题的方法——请参见这里:https://dev59.com/eWrWa4cB1Zd3GeqP-2sx - greenoldman
4
根据Kat Lim Ruiz所述,您还可以使用免费的开源替代品ILSpy。 - Marcus Mangelsdorf
这个答案对我有用:https://dev59.com/yHA75IYBdhLWcg3wH1TP#3461027。 - ckkkitty

21
你有几个选择:要以编程方式从托管代码中获取它,请使用Assembly.ImageRuntimeVersion。
Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

从命令行开始,在v2.0版本中,ildasm.exe会在你双击"MANIFEST"并查找"Metadata version"时显示它。确定图像的CLR版本

如何获取当前应用程序域的ImageRuntimeVersion? - Kiquenet

19

使用ILSpy http://ilspy.net/

开源且免费,现在因为Reflector需要付费,因此绝对是一个可选方案。


18

只是简单地

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

1
我不知道为什么它被评为负分,但是我可以运行这个片段(需要引用System.Runtime.Versioning),并成功地获得输出(这是来自LINQPad的): TypeId typeof(TargetFrameworkAttribute) FrameworkName .NET Framework,Version=v4.0 FrameworkDisplayName .NET Framework 4 - Sudhanshu Mishra
这段代码无法检索框架的完整版本。了解“4.0”是好的,但如果您想访问RegAsm.exe,则“v4.0.30319”会更有用。更完整的版本信息可以在以下位置找到:string tar = Assembly.LoadFrom(@“myAssembly.dll”)。ImageRuntimeVersion; - Martin
这似乎是正确的方法,是否存在任何情况,其中一个程序集可能没有应用此属性?我已经使用.NET Core程序集进行了测试,并且它正确地报告了netcore和版本号。 - Adam Naylor
这对我不起作用。GetCustomAttributes没有TargetFrameworkAttribute。但是ImageRuntimeVersion可以正常工作,它检索二进制文件构建的正确CLR。我需要它构建的目标框架版本。 - Shameel Mohamed
这比那复杂得多。这个答案仅适用于.NET Framework 4.x,并由Microsoft C#编译器编译。它不适用于实际问题。 - Lex Li
@LexLi 你需要明白这个问题已经12年了,.net 4是当时最新的版本。答案是相对于问题提出时的时间而言的。 - st35ly

15

通过Visual Studio的另一个选项,将DLL添加到任何项目的引用中,然后右键单击新的引用并单击“属性”,您可以在运行时版本中查看您要查找的内容:

输入图像描述


我认为这个问题并不是在询问当一个DLL在Visual Studio中被引用时的情况,而是任何你在电脑上找到的.NET DLL。 - ashes999
7
这个答案表明,你可以添加电脑上任何找到的.NET DLL的引用,而在该DLL对应的“引用”下的项目属性之一是“运行时版本”。 - ALEXintlsos
那是CLR版本,而不是被询问的.NET Framework版本。 - Lex Li

12
最简单的方法:只需在任何文本编辑器中打开.dll文件。查看其中一行的最后几行: 输入图像描述

所有选项中最好的选择 - Sisir
2
然而,这对于构建在 .Net 3.0 之前的动态链接库无效。 - Sisir
1
@Sisir,没有".NET 3.0"这种东西 - 我猜你是想说_.NET Core 3.x_,对吗?(以免混淆2006年的.NET Framework 3.0,它其实在.NET Framework 2.0 CLR上运行,非常令人困惑) - Dai
我在下面的答案中使用了这种方法。我只处理了.NETFramework和.NETCoreApp,但对于我所需的内容它是有效的。 https://dev59.com/yHA75IYBdhLWcg3wH1TP#72144367 - Derek

8

使用ILDASM反编译它,并查看被引用的mscorlib版本(应该在顶部附近)。


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