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

Posted

技术标签:

【中文标题】如何找出可执行文件需要运行的 .NET Framework 版本?【英文标题】:How to find out which version of the .NET Framework an executable needs to run? 【发布时间】:2010-09-24 11:09:50 【问题描述】:

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

有没有一种简单的方法可以在某处找到这些信息?

(到目前为止,我尝试了ILDASM 和DUMPBIN,但没有任何运气。)

【问题讨论】:

另见***.com/questions/3460982/… docs.microsoft.com/en-us/sysinternals/downloads -- Process Explorer 做得很好,而且易于使用,只需以管理员身份运行即可 【参考方案1】:

使用Notepad,三个十年前,大小200kb,预装工具:

notepad appname.exe打开应用程序, 搜索“框架”一词, 使用F3 重复上次搜索,直到出现.NET Framework,version=vX.Y 如果没有找到(低于 3.0 的版本)搜索 v2. ... 仍然比安装千兆字节的点网分析器工具和垃圾工作室容易 100 倍。

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

【讨论】:

这很棒——特别是如果您无法使用反编译/其他工具 更新:可能找不到,反而可能有一个“.NETStandard,version=...”【参考方案2】:

我认为您可以可靠获得的最接近的方法是确定所需的 CLR 版本。您可以通过使用 ILDASM 并查看“MANIFEST”节点或 Reflector 并将“Application.exe”节点的分解视图作为 IL 来执行此操作。在这两种情况下,都有一条注释指示 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,查看列出的每个参考的 dissambly(仍为 IL):

.assembly extern System.Core

    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)

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

【讨论】:

不幸的是,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【参考方案3】:

更简单的方法是使用 dotPeek 并查看树中显示的内容。

查看属性面板:

【讨论】:

【参考方案4】:

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

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

【讨论】:

请注意,TargetFrameworkAttribute 仅在 .NET 4.0 中添加,因此不会出现在针对 .NET 3.5 或更早版本编译的程序集中。 ILSpy 在单击加载的程序集根节点时在 cmets 中显示“Runtime: vXXX”。我能够看到一个 v1.1.4322 框架项目。【参考方案5】:

您可以从代码中使用Assembly.ImageRuntimeVersion,但通过查看文件,最好的办法可能是使用反射器并查看引用了哪个版本的mscorlib

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

【讨论】:

这是错误的。 OP 询问的是 .NET Framework 的版本,而不是 CLR 运行时的版本。这个答案解决了后者。例如,我正在针对使用 CLR 运行时版本 4.0.30139 的 Framework 4.7.2531.0 运行。 ImageRuntimeVersion 返回 CLR 版本,而不是 Framework 版本。【参考方案6】:

从命令行:find "Framework" MyApp.exe

【讨论】:

【参考方案7】:

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

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

【讨论】:

无法区分.Net4和.Net4.5【参考方案8】:

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

【讨论】:

这对我不起作用。我将所有内容复制并粘贴到 powershell 中,并将路径更改为 exe 路径,它只告诉我应用程序的名称,没有别的【参考方案9】:

或者你可以找出它有哪个 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【参考方案10】:

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

strings that_app.exe | grep 'v2.\|Framework'

【讨论】:

以上是关于如何找出可执行文件需要运行的 .NET Framework 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 .NET 可执行文件在 64 位操作系统上作为 32 位进程运行?

找出 pro 文件中使用的 qmake 可执行文件

我的 .net 核心发布的可执行文件提供了与运行代码时不同的目录路径

如何通过 Makefile 将 cap_net_raw 功能添加到 Linux 上的 c++ 可执行文件

如何从另一个 .NET 进程获取对象的句柄?

.NET Framework概述