107

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

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

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

4

10 回答 10

73

使用记事本,三个十年前,大小为 200kb,预装工具:

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

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

于 2016-10-24T05:41:40.827 回答
55

我认为您可以可靠地获得的最接近的是确定所需的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% 可靠,但我认为它不会很快改变。

于 2008-11-28T15:00:46.943 回答
34

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

查看属性面板: 在此处输入图像描述

于 2011-10-25T13:05:21.203 回答
26

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

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
于 2013-06-11T12:54:33.727 回答
15

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

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

于 2009-11-24T19:03:54.733 回答
13

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

于 2017-02-03T22:42:01.983 回答
12

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

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

于 2012-04-06T21:13:44.307 回答
3

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

于 2020-03-27T17:57:28.763 回答
2

或者你可以找出它有哪个 System.Core 引用。这将告诉您此应用程序正在使用的 .NET Framework 版本。对于 2.0,System.Core 的版本将为 2.0.xxx.xxx。对于 3.5,版本将为 3.5.xxx.xxx 等。

于 2013-01-18T18:39:57.243 回答
1

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

strings that_app.exe | grep 'v2.\|Framework'
于 2017-11-02T12:49:48.920 回答