我有一个针对.NET框架编译并部署的旧DLL。我不确定它编译的.NET框架的哪个版本。我想知道如何确定这个dll编译的.NET框架的哪个版本?我不相信源代码,因为我相信它已升级到Visual Studio 2008并更改为.NET framework版本3.5。
答案 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)
答案 2 :(得分:50)
答案 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)
答案 8 :(得分:8)
使用ILDASM对其进行反编译,并查看正在引用的mscorlib的版本(应该在顶部非常正确)。
答案 9 :(得分:6)
答案 10 :(得分:0)
答案 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)文件。完全免费,可用于商业和非商业用途。