确定dll的.NET Framework版本

时间:2010-08-11 17:11:37

标签: .net .net-framework-version

我有一个针对.NET框架编译并部署的旧DLL。我不确定它编译的.NET框架的哪个版本。我想知道如何确定这个dll编译的.NET框架的哪个版本?我不相信源代码,因为我相信它已升级到Visual Studio 2008并更改为.NET framework版本3.5。

14 个答案:

答案 0 :(得分:99)

在PowerShell中,您可以使用以下内容来获取目标运行时:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

我从Ben Griswold's answer将其改编为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,版本= v4.5.2

答案 1 :(得分:65)

dotPeek是展示此信息的绝佳工具。

如果您在掌握Reflector时遇到一些问题,那么这是一个不错的选择。

enter image description here

答案 2 :(得分:50)

将其加载到Reflector并查看它引用的内容?

例如:

enter image description here

答案 3 :(得分:45)

您可以使用ILDASM ...

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

并检查输出中的“元数据部分”。它会是这样的:

  

元数据部分:0x424a5342,版本:1.1,额外:0,版本len:   12,版本:v4.0.30319

'version'标记将告诉您.NET Framework版本。在上面的例子中,它是4.0.30319

答案 4 :(得分:15)

您有几个选择:要以编程方式从托管代码获取它,请使用Assembly.ImageRuntimeVersion:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

从命令行开始,从v2.0开始,如果双击“MANIFEST”并查找“元数据版本”,ildasm.exe将显示它。 Determining an Image’s CLR Version

答案 5 :(得分:14)

使用ILSpy http://ilspy.net/

开源,免费,绝对是一种选择,因为现在支付反射器。

答案 6 :(得分:13)

只是简单地

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

答案 7 :(得分:11)

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

enter image description here

答案 8 :(得分:8)

使用ILDASM对其进行反编译,并查看正在引用的mscorlib的版本(应该在顶部非常正确)。

答案 9 :(得分:6)

最简单的方法:只需在任何文本编辑器中打开.dll。看一下最后一行: enter image description here

答案 10 :(得分:0)

如果您有DotPeek中的JetBrains,则可以在Assembly Explorer中看到它。

Can you see this screenshot? im not:(

答案 11 :(得分:0)

在这里扩展答案,如果有从属程序集,则可能会爆炸。如果您很幸运并且知道受抚养人在哪里(或者甚至更幸运,它在GAC中),那么这可能会有所帮助...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

参考:https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

答案 12 :(得分:0)

我迅速编写了这个C#控制台应用程序来做到这一点:

https://github.com/stuartjsmith/binarydetailer

只需将目录作为参数传递,它将尽力告诉您其中每个dll和exe的网络框架

答案 13 :(得分:0)

Detect It Easy”也称为DiE是用于确定文件类型的程序。适用于.dll文件或其他(.exe)文件。完全免费,可用于商业和非商业用途。

enter image description here