如何找出可执行文件需要运行哪个版本的.NET Framework?


97

我有一个可执行文件,我想知道该文件需要启动的.NET Framework版本。

有什么简单的方法可以在某处找到此信息?

(到目前为止,我没有碰到运气就尝试了ILDASMDUMPBIN。)



docs.microsoft.com/en-us/sysinternals/downloads-Process Explorer做到这一点非常好且易于使用,只需以admin
身份

Answers:


55

我认为您可以可靠地获得的最接近的结果是确定所需的CLR版本。您可以通过使用ILDASM并查看“ MANIFEST”节点或Reflector并以IL形式查看“ Application.exe”节点的分散视图来完成此操作。在这两种情况下,都有注释指示CLR版本。在ILDASM中,注释为“ //元数据版本”,在Reflector中,注释为“目标运行时版本”。

以下是名为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查看“ 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,查看列出的每个参考的虚弱(仍为IL):

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

通过查找具有最高版本元数据的引用,您可以确定引用来自哪个版本的Framework,这表明您需要安装相同版本的Framework才能运行该应用程序。话虽如此,我不会将其视为100%可靠,但我认为它不会很快改变。


4
不幸的是,Microsoft为上述技术引入了重大变化。.NET 4.5程序集不能在原始.NET 4上运行,并且要告诉.NET 4.5程序集,您还需要阅读System.Runtime.Versioning.TargetFrameworkAttribute。lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li

55

使用记事本(已存在三十年了,大小为200kb)预安装了以下工具:

  • 开放的应用与notepad appname.exe
  • 搜索单词“ framework”,
  • 重复上一次搜索,F3直到.NET Framework,version=vX.Y出现
  • 如果未找到任何内容(版本低于3.0),则搜索v2....仍然容易100倍,然后安装了千兆字节的点网分析器工具和垃圾工作室。

其他任何编辑器/查看器也可以打开二进制文件,例如Notepad ++或totalCommander的出色文本/十六进制查看器列表器


这非常好-特别是如果您无权使用反编译/其他工具
Craig

@BentTranberg有趣,您可以通过gmail com的asainnp以某种方式向我发送exe吗?
Asain Kujovic,


22

现在,您可以使用ILSpy来检查程序集的目标框架。加载程序集后,单击程序集节点的根,您可以在TargetFramework声明下找到信息:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

2
请注意,TargetFrameworkAttribute仅在.NET 4.0中添加,因此在针对.NET 3.5或更早版本编译的程序集中将不存在。
Wai Ha Lee

单击已加载的程序集根节点时,ILSpy会在注释中显示“运行时:vXXX”。我能够看到一个v1.1.4322框架项目。
ryancdotnet

15

通过代码可以使用,Assembly.ImageRuntimeVersion但是通过查看文件,可能最好的方法是使用反射器并查看mscorlib所引用的版本。

编辑: 更好的方法是使用ildasm,打开程序集,然后查看程序集的清单。清单的第一行将告诉您为程序集构建的CLR 的确切版本。


3
错了 OP询问的是.NET Framework的版本,而不是CLR运行时的版本。这个答案解决了后者。例如,我针对使用LR运行时版本4.0.30139的Framework 4.7.2531.0运行。ImageRuntimeVersion返回CLR版本,而不是Framework版本。
汤姆·巴克斯特

11

您可以使用一个名为CorFlags.exe的工具。自.NET 2.0以来,它就已经存在,并且我肯定知道它包含在Windows SDK 7.0中。默认情况下(在Windows XP Pro上)它将安装到C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe。为它提供托管模块的文件路径(不带任何其他命令行标志)以显示其头信息,包括版本。

请记住,此实用程序旨在修改模块的PE32标头,因此在仔细阅读文档之前,请勿使用任何标志。


1
无法区分.Net4和.Net4.5
mheyman 2014年


2

或者,您可以仅查找System.Core的哪个引用。这将告诉您此应用程序正在使用的.NET Framework版本。对于2.0,System.Core的版本将为2.0.xxx.xxx。对于3.5,版本将是3.5.xxx.xxx,依此类推。


我不认为这是真的。我有一个4.5的目标框架,但使用System.Core 4.0.XXX.XXX
Paul Totzke '16

2

您可以使用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也将执行相同的操作。


1

在Linux / OSX / unix上,您可以使用:

strings that_app.exe | grep 'v2.\|Framework'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.