确定DLL的.NET Framework版本

Determine .NET Framework version for dll

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


在PowerShell中,可以使用以下命令获取目标运行时:

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

我根据Ben Griswold的回答将其适应了PowerShell。

如果您想知道Visual Studio中指定的目标框架版本,请使用:

1
2
3
4
5
$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


dotPeek是一个很好的(免费)工具,可以显示此信息。

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

enter image description here


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

例如:

enter image description here


您可以使用ILDASM ...

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

并在输出中检查"元数据部分"。就像这样:

Metadata section: 0x424a5342, version: 1.1, extra: 0, version len:
12, version: v4.0.30319

'version'标签将告诉您.NET Framework版本。在上面的示例中是4.0.30319


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

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

从v2.0开始,从命令行开始,如果您双击" MANIFEST"并查找" Metadata version",ildasm.exe将显示它。确定图片的CLR版本


使用ILSpy http://ilspy.net/

开源的,免费的,肯定是一个选择,因为现在已经支付了反射器。


只是简单

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


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

enter image description here


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


我迅速编写了这个C#控制台应用程序来执行此操作:

https://github.com/stuartjsmith/binarydetailer

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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


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

Can you see this screenshot? im not:(