如何找出哪个版本的.NET Framework需要运行一个可执行文件?
我有一个可执行文件,我想知道哪个版本的.NET框架需要启动这个文件。
有没有简单的方法来find这个信息的地方?
(到目前为止,我没有任何运气尝试ILDASM和DUMPBIN 。)
我认为最接近你可以得到的是确定什么版本的CLR是必需的。 您可以通过使用ILDASM并查看“MANIFEST”节点或Reflector并查看“Application.exe”节点的拆分视图作为IL来执行此操作。 在这两种情况下,都有一个表示CLR版本的评论。 在ILDASM中,注释是“//元数据版本”,reflection器中的注释是“目标运行时版本”。
以下是名为WindowsFormsApplication1.exe的.NET WinForms应用程序的示例:
ILDASM:
// Metadata version: v2.0.50727 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 } .assembly extern System { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 }
reflection:
.module WindowsFormsApplication1.exe .subsystem 0x0002 // MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8} // Target Runtime Version: v2.0.50727
您还可以查看引用的程序集列表,并查找具有最高版本号的引用。
再次,使用ILDASM查看“MANIFEST”节点数据:
.assembly extern System.Drawing { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: .ver 2:0:0:0 } .assembly extern System.Core { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 3:5:0:0 }
并使用reflection器,查看每个参考列出的dissambly(仍然是IL):
.assembly extern System.Core { .ver 3:5:0:0 .publickeytoken = (B7 7A 5C 56 19 34 E0 89) }
通过查找具有最高版本元数据的引用,您可以确定引用来自哪个版本的Framework,这表示您需要安装用于运行应用程序的相同版本的Framework。 这就是说,我不认为这是100%可靠的,但我不认为这将改变很快。
更简单的方法是使用dotPeek并查看树中显示的内容。
从代码你可以使用Assembly.ImageRuntimeVersion
但通过查看文件可能是最好的事情是使用reflection器,看看哪个版本的mscorlib
被引用。
编辑:更好的办法是使用ildasm ,打开你的程序集,然后查看程序集清单。 清单的第一行将会告诉你程序集所build立的CLR的确切版本。
您现在可以使用ILSpy来检查程序集的目标框架。 加载程序集后,单击程序集节点的根目录,可以在TargetFramework声明下find这些信息:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
使用记事本 ,三十年前,200kb大小,预装工具:
- 用
notepad appname.exe
打开应用程序, - search单词“框架”,
- 用
F3
重复上次search,直到.NET Framework,version=vX.Y
显示出来 - 如果没有发现(版本低于3.0)search
v2.
…安装千兆字节的networking分析工具和垃圾工作室仍然容易100倍。
任何其他编辑器/查看器也可以打开二进制文件,如Notepad ++或totalCommander的文本/hex查看器列表 。
您可以使用名为CorFlags.exe的工具。 从.NET 2.0开始就已经有了,我确定它已经包含在Windows SDK 7.0中。 默认情况下(在Windows XP Pro上)它被安装到C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe。 为它提供一个托pipe模块的文件path(不带任何其他命令行标志)来显示它的头信息,其中包括版本。
请记住,此实用程序旨在修改模块的PE32标头,所以在仔细阅读文档之前不要使用任何标志。
从命令行: find "Framework" MyApp.exe
或者你可以找出它具有的System.Core的引用。 这将告诉你这个应用程序正在使用的.NET Framework版本。 对于2.0版本的System.Core将是2.0.xxx.xxx。 3.5的版本将是3.5.xxx.xxx等
在Linux / OSX / Unix上,您可以使用:
strings that_app.exe | grep 'v2.\|Framework'