我有一个可执行文件,我想知道该文件需要启动哪个版本的 Microsoft .NET Framework。
有没有一种简单的方法可以在某处找到这些信息?
我有一个可执行文件,我想知道该文件需要启动哪个版本的 Microsoft .NET Framework。
有没有一种简单的方法可以在某处找到这些信息?
我认为您可以可靠地获得的最接近的是确定所需的CLR版本。您可以通过使用 ILDASM 并查看“MANIFEST”节点或 Reflector 并将“Application.exe”节点的分解视图作为 IL 来执行此操作。在这两种情况下,都会有一条注释指示 CLR 版本。在 ILDASM 中,注释是“// 元数据版本”,而在 Reflector 中,注释是“目标运行时版本”。
以下是名为 WindowsFormsApplication1.exe 的 .NET WinForms 应用程序的示例:
伊尔达斯姆:
// 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 查看“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
}
并使用 Reflector,查看列出的每个参考的 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 版本。
从命令行:find "Framework" MyApp.exe
您可以使用名为 CorFlags.exe 的工具。它从 .NET 2.0 开始就存在,我确信它包含在 Windows SDK 7.0 中。默认情况下(在 Windows XP Pro 上)它安装到 C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\CorFlags.exe。向它提供托管模块的文件路径(没有任何其他命令行标志)以显示其标头信息,其中包括版本。
请记住,此实用程序旨在修改模块的 PE32 标头,因此在仔细阅读文档之前不要使用任何标志。
您可以使用 Powershell 在 Windows 中获取文件的 .NET 版本。以下脚本;
$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
$filename = $file.BaseName
$version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
select-object -ExpandProperty ConstructorArguments |
select-object -ExpandProperty Value |
select-string -Pattern '.NET')
Write-Output "$filename,$version"
}
请注意,结果为该文件夹中的 exe 文件提取了 .NET 版本,但它也会对 dll 执行相同的操作。
或者你可以找出它有哪个 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'