如何找出哪个版本的.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)searchv2. …安装千兆字节的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'