如何找出哪个版本的.净框架的一个可执行的运行所需要的?
-
11-07-2019 - |
解决方案
我觉得你可以可靠地得到最接近的是要确定的是什么版本的 CLR 是必需的。您可以使用ILDASM来看,在“清单”节点或反思,并在看“Application.exe”节点作为IL的dissasembly视图做到这一点。在这两种情况下,有一个评论,表示CLR版本。在ILDASM,注释是“//元数据版本”,并在反射镜中的注释是“目标运行时版本”。
下面是名为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
}
反射器:
.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727
您也可以看看引用的程序列表,查找具有最高版本号的参考。
再次使用ILDASM在看“清单”节点数据:
.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
}
和使用反射,看着dissambly(仍IL)对于列出的每个参考:
.assembly extern System.Core
{
.ver 3:5:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
通过找到具有最高版本的元数据的参考,你可以决定什么是从参考,这将表明你需要安装运行应用程序框架的相同版本附带的框架的版本。话虽这么说,我不会把它当作100%可靠的,但我不认为它会很快改变。
其他提示
有一个更简单的方法是使用 dotPeek 和看树显示的内容。
现在可以使用 ILSpy 来检查一个组件的所述目标框架。加载程序集后,单击装配节点的根,你可以找到TargetFramework声明下的信息:
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
从代码可以使用 Assembly.ImageRuntimeVersion
但是,通过查看文件可能做的最好的事情就是使用反射镜,看看哪个版本的 mscorlib
是被引用。
编辑: 甚至更好的是使用 ildasm, 打开你会的,然后查看清单的组件。第一线的清单会告诉你的 确切的 版本的CLR,大会建。
您可以使用一个名为CorFlags.exe工具。它已经出现自.NET 2.0的,我肯定知道它是包含在Windows SDK 7.0。默认情况下(在Windows XP专业版),它被安装到C:\ Program Files文件\微软的SDK \的Windows \ v7.0A \ BIN \ CorFlags.exe。与文件路径的管理模块(没有任何其他命令行标志)来显示其报头信息,其中包括的版本提供。
记请将此实用的设计修改模块的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'