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

如何确定可执行文件需要运行.NET Framework的哪个版本?,.net,version,executable,.net,Version,Executable,我有一个可执行文件,我想知道需要启动该文件的Microsoft.NET Framework的哪个版本 有没有一种简单的方法可以在某处找到这些信息 (到目前为止,我已经尝试过了,但没有任何运气。)我认为最可靠的方法是确定需要什么版本的CLR。您可以通过使用ILDASM并查看“MANIFEST”节点或反射器,以及将“Application.exe”节点的dissasembly视图视为IL来实现这一点。在这两种情况下,都有一条注释指示CLR版本。在ILDASM中,注释为“//元数据版本”,在Refle

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

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


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

我认为最可靠的方法是确定需要什么版本的CLR。您可以通过使用ILDASM并查看“MANIFEST”节点或反射器,以及将“Application.exe”节点的dissasembly视图视为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查看“清单”节点数据:

.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
}
使用反射器,查看列出的每个参考的偏差(仍为IL):

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
通过查找具有最高版本元数据的引用,您可以确定引用来自哪个版本的框架,这表明您需要安装相同版本的框架才能运行应用程序。也就是说,我不会认为这是100%可靠的,但我认为它不会很快改变。

从您可以使用的代码,但通过查看文件,最好的做法可能是使用reflector,查看引用的是哪个版本的
mscorlib


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

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

请参见“属性”面板:

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


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

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

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

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
使用30年前预装的200kb大小的工具:

  • 使用记事本appname.exe打开应用程序
  • 搜索“框架”一词
  • 使用
    F3
    重复上一次搜索,直到显示
    .NET Framework,version=vX.Y
  • 如果未找到任何内容(低于3.0的版本),请搜索
    v2.
    。。。比安装千兆字节的网络分析仪工具和垃圾工作室要容易100倍

任何其他编辑器/查看器也可以打开二进制文件,如记事本++或totalCommander的伟大文本/十六进制查看器。

从命令行:
查找“Framework”MyApp.exe

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

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

您可以使用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也会这样做。

另请参见--Process Explorer做得很好,使用起来很方便,只需在Microsoft为上述技术引入突破性更改时运行它即可。NET 4.5程序集无法在原始.NET 4上运行,要告诉.NET 4.5程序集,还需要读取System.Runtime.Versioning.TargetFrameworkAttribute。无法区分.Net4和.Net4.5我认为这不是真的。我的目标框架是4.5,但使用System.Core 4.0.XXX.XXX这是错误的。OP询问的是.NET Framework的版本,而不是CLR运行时的版本。这个答案是针对后者的。例如,我运行的是使用CLR运行时版本4.0.30139的Framework 4.7.2531.0。ImageRuntimeVersion返回CLR版本,而不是框架版本。这非常好,尤其是在您没有反编译/其他访问权限的情况下tools@BentTranberg有趣的是,你能尽快在gmail com上给我发送exe吗?请注意,它只添加到.NET 4.0中,因此不会出现在针对.NET 3.5或更早版本编译的程序集上单击加载的程序集根节点时,在注释中显示“Runtime:vXXX”。我能够看到v1.1.4322框架项目。这对我不起作用。我将所有内容复制并粘贴到powershell中,并将路径更改为exe路径,它只告诉我应用程序的名称,而不告诉我其他内容