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

时间:2008-11-28 14:42:55

标签: .net version executable

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

有没有简单的方法可以在某个地方找到这些信息?

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

10 个答案:

答案 0 :(得分:52)

我认为您可以接受的最接近的是确定需要哪种版本的 CLR 。您可以通过使用ILDASM并查看“MANIFEST”节点或Reflector并将“Application.exe”节点的dissasmbly视图视为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)
}

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

答案 1 :(得分:38)

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

  • 使用duration
  • 打开应用程序
  • 搜索单词" framework",
  • 使用notepad appname.exe重复上次搜索,直到F3显示
  • 如果找不到任何内容(版本低于3.0),请搜索.NET Framework,version=vX.Y ...然后再安装数十亿字节的点网分析工具和垃圾工作室。

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

答案 2 :(得分:29)

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

请参阅属性面板: enter image description here

答案 3 :(得分:19)

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

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

答案 4 :(得分:15)

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

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

答案 5 :(得分:10)

您可以使用名为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之前请不要使用任何标记。

答案 6 :(得分:7)

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

答案 7 :(得分: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"
}

提供以下结果; enter image description here

请注意,结果为该文件夹中的exe文件提取了.NET版本,但对dll也是如此。

答案 8 :(得分:2)

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

答案 9 :(得分:1)

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

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