确定 dll 的.NETFramework 版本

我有一个旧的 dll 是编译对。NET 框架和部署。我不确定哪个版本的。它是根据 NET 框架编译的。我想知道我如何才能确定哪个版本的。这个 dll 是根据 NET 框架编译的吗?我不能信任源代码,因为我相信它已升级到 VisualStudio2008并更改为。NET 框架3.5版。

147294 次浏览

把它载入 反光镜,看看它引用了什么?

例如:

enter image description here

用 ILDASM 反编译它,然后查看被引用的 mscolib 版本(应该就在顶部)。

你可以用 ILDASM..。

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

并检查输出中的“元数据部分”:

元数据部分: 0x424a5342,版本: 1.1,附加: 0,版本: 12,版本: v4.0.30319

“ version”标签会告诉你. NET Framework 的版本,在上面的例子中是4.0.30319

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

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 版本

DotPeek 是一个很好的(免费的)显示此信息的工具。

如果你有一些问题得到反射器,然后这是一个很好的选择。

enter image description here

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

enter image description here

很简单

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

使用 ILSpy http://ilspy.net/

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

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

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

我把它从 Ben Griswold 的回答改编成 PowerShell。

如果要了解 VisualStudio 中指定的目标框架版本,请使用:

$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

如果您有来自 JetBrains 的 DotPeek,您可以在程序集资源管理器中看到它。

Can you see this screenshot? im not:(

扩展这里的答案,如果有一个依赖程序集,这可能会爆炸。如果你很幸运,你知道依赖者在哪里(或者更幸运的是,它在 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

为此,我很快编写了这个 C # 控制台应用程序:

Https://github.com/stuartjsmith/binarydetailer

只需将一个目录作为参数传递,它就会尽最大努力告诉您每个 dll 和 exe 的网络框架

轻而易举”也称 DiE,是一个用于确定文件类型的程序。一起工作。Dll 文件或其他(。Exe)文件。商业和非商业用途完全免费。

enter image description here

最简单的方法是: 在任何文本编辑器中打开. dll: enter image description here

使用“阅读 dll 的文本内容”方法:

private static readonly Regex CompiledNetCoreRegex = new Regex(@".NETCoreApp,Version=v[0-9\.]+", RegexOptions.Compiled);
private static readonly Regex CompiledNetFrameworkRegex = new Regex(@".NETFramework,Version=v[0-9\.]+", RegexOptions.Compiled);


// You can define other methods, fields, classes and namespaces here
public string GetTargetFramework(FileInfo dll)
{
string contents = File.ReadAllText(dll.FullName);
 

Match match = CompiledNetCoreRegex.Match(contents);
if (match.Success)
{
return match.Value;
}


match = CompiledNetFrameworkRegex.Match(contents);
if (match.Success)
{
return match.Value;
}


return "unable to compute target framework";
}