簡體   English   中英

如何找出可執行文件需要運行的 .NET 框架的哪個版本?

[英]How to find out which version of the .NET Framework an executable needs to run?

我有一個可執行文件,我想知道該文件需要啟動哪個版本的 Microsoft .NET 框架。

有沒有一種簡單的方法可以在某處找到這些信息?

(到目前為止,我嘗試了ILDASMDUMPBIN ,但沒有任何運氣。)

使用Notepad ,三年前,大小為 200kb,預裝工具:

  • notepad appname.exe打開應用程序,
  • 搜索詞“框架”,
  • F3重復上次搜索,直到.NET Framework,version=vX.Y出現
  • 如果沒有找到(低於 3.0 的版本),請搜索v2. ...仍然比安裝千兆字節的 dot net 分析器工具和垃圾工作室容易 100 倍。

任何其他編輯器/查看器也可以打開二進制文件,例如 Notepad++ 或 totalCommander 的出色文本/十六進制查看器列表器

我認為您可以可靠地獲得的最接近的是確定需要哪個版本的CLR 您可以通過使用 ILDASM 並查看“MANIFEST”節點或反射器並將“Application.exe”節點的分解視圖作為 IL 來執行此操作。 在這兩種情況下,都有指示 CLR 版本的注釋。 在 ILDASM 中,注釋是“// Metadata version”,在 Reflector 中,注釋是“Target Runtime Version”。

以下是名為 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,查看列出的每個參考的可拆卸性(仍為 IL):

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

通過查找具有最高版本元數據的引用,您可以確定引用來自哪個版本的 Framework,這表明您需要安裝相同版本的 Framework 才能運行應用程序。 話雖如此,我不會將其視為 100% 可靠,但我認為它不會很快改變。

更簡化的方法是使用dotPeek並查看樹中顯示的內容。

查看屬性面板: 在此處輸入圖片說明

您現在可以使用ILSpy檢查程序集的目標框架。 加載程序集后,點擊程序集節點的根節點,可以在TargetFramework聲明下找到信息:

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

從代碼中,您可以使用Assembly.ImageRuntimeVersion但通過查看文件,最好的辦法可能是使用反射器並查看正在引用哪個版本的mscorlib

編輯:更好的是使用ildasm ,打開你的程序集,然后查看程序集的清單。 清單的第一行將告訴您程序集所針對的 CLR 的確切版本。

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

您可以使用名為 CorFlags.exe 的工具。 它從 .NET 2.0 開始就存在,我確信它包含在 Windows SDK 7.0 中。 默認情況下(在 Windows XP Pro 上)它安裝到 C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0A\\bin\\CorFlags.exe。 為其提供托管模塊的文件路徑(沒有任何其他命令行標志)以顯示其頭信息,其中包括版本。

請記住,此實用程序旨在修改模塊的 PE32 標頭,因此在仔細閱讀文檔之前不要使用任何標志。

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

或者您可以找出它具有 System.Core 的哪個引用。 這將告訴您此應用程序正在使用的 .NET Framework 版本。 對於 2.0,System.Core 的版本將為 2.0.xxx.xxx。 對於 3.5,版本將為 3.5.xxx.xxx 等。

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

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

對於較新的 .NET 6.0 應用程序,記事本方法對我不起作用,但如果在 exes 旁邊有一個 *.deps.json 文件,這是一個很大的線索 - 通常包含以下部分形式的版本

"runtimeTarget": {
    "name": ".NETCoreApp,Version=v6.0/win-x86"

編輯:跟進,您還可以查找一對同名的.exe 和.dll 文件,嘗試在記事本中打開 DLL 文件並搜索NETCoreApp ,您應該會找到如下內容:

.NETCoreApp,Version=v6.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM