2008-11-28 122 views
75

我有一個可執行文件,我想知道哪些版本的.NET框架需要啓動該文件。如何找出可執行文件需要運行的.NET Framework版本?

有沒有簡單的方法在某處找到這個信息?

(到目前爲止,我試過ILDASMDUMPBIN沒有任何的運氣。)

+0

參見http://stackoverflow.com/questions/3460982/determine-net-framework- version-for-dll?tab =最初#tab-top – 2011-03-22 09:12:28

回答

49

我認爲你可以得到可靠的最接近的是,以確定需要什麼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在看 「清單」 節點數據:

.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 
} 

而且使用反射,看着dissambly(仍然爲IL)對於列出的每個參考:

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

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

+3

不幸的是,微軟爲上述技術引入了一個突破性的改變。 .NET 4.5程序集無法在原始.NET 4上運行,並且要告訴.NET 4.5程序集,還需要閱讀System.Runtime.Versioning.TargetFrameworkAttribute。 http://www.lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html – 2013-04-14 03:34:46

15

從代碼你可以使用Assembly.ImageRuntimeVersion,但通過查看文件可能是最好的事情是使用反射器,看看哪個版本的mscorlib被引用。

編輯:更好的辦法是使用ildasm,打開你的程序集,然後查看程序集清單。清單的第一行將告訴您該程序集是爲其構建的CLR版本的確切的版本。

+0

這是錯誤的。 OP詢問了.NET Framework的版本,而不是CLR Runtime的版本。這個回答解決了後者。作爲一個例子,我運行在使用CLR Runtime版本4.0.30139的Framework 4.7.2531.0上。 ImageRuntimeVersion返回CLR版本,而不是Framework版本。 – 2017-08-24 14:12:27

23

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

查看屬性面板: enter image description here

+1

非常好的工具,正是我需要的! – Surfbutler 2014-07-29 14:26:52

+0

我在找什麼? – 2018-03-05 13:42:32

+1

@BentTranberg我添加了一個屏幕截圖,我不認爲這是真的 – 2018-03-05 13:45:46

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之前,請勿使用任何標誌。

+1

不能.NET4和.Net4.5 – mheyman 2014-02-27 13:11:56

2

或者,你可以發現它具有System.Core程序的參考。這會告訴你這個應用程序正在使用的.NET Framework版本。對於2.0,System.Core的版本將是2.0.xxx.xxx。對於3.5版本將是3.5.xxx.xxx等

17

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

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

使用Notepad,三個十年的歷史,200KB大小,預裝的工具:

  • 開放的應用與notepad appname.exe
  • 搜索詞「框架」,
  • 重複與F3一次搜索,直到.NET Framework,version=vX.Y顯示出來
  • 如果沒有找到(版本低於3.0)搜索v2. ...還是那麼安裝的點網分析工具和垃圾工作室千兆容易100倍。

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

5

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

0

在Linux/OSX/UNIX您可以使用:

strings that_app.exe | grep 'v2.\|Framework' 
相關問題