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时遇到一些问题,那么这是一个不错的选择。
将其加载到Reflector中,看看它引用了什么?
例如:
您可以使用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的引用添加到任何项目,然后右键单击新引用并单击"属性",您可以看到在运行时版本中要查找的内容:
使用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
如果您有