2010-02-22 28 views

回答

49

ildasm.exe將顯示它,如果您雙擊「MANIFEST」並查找「元數據版本」。默認情況下,它是圖像編譯的版本。

+0

非常感謝:-) – 2010-02-22 12:07:50

+0

要打開它,也許按下「Win-Start」鍵入'prompt'並打開Visual- Studio「VS XXXX的開發者命令提示符」。 然後,您可以通過命令行使用'ildasm'或鍵入'ildasm.exe'來打開UI並按照此答案所述使用它。 我發現'[mscorlib] System.Runtime.Versioning.TargetFrameworkAttribute ::。ctor(string)',其中包括框架版本。 (也許最大化窗口。Hex-Value的右側是ASCII-Interpretaion) – MichiBack 2017-11-29 15:20:27

31
class Program { 
    static void Main(string[] args) { 
     System.Console.WriteLine(
      System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion); 
    } 
} 

編譯並運行最新的.NET框架下的上述應用程序(如舊的CLR可能無法加載需要一個新的CLR組件),然後運行它傳遞的路徑,要檢查的組裝命令行參數。

+0

+1謝謝。這對自動化很有用。 – 2010-02-22 12:12:35

+0

當沒有useLegacyV2RuntimeActivationPolicy配置標誌加載較舊的混合模式程序集時,此答案會出現問題。 – gigaplex 2013-10-09 03:25:57

+0

謝謝。有一箇舊的.NET DLL,CCW,我正在使用64位.NET 4版本進行重寫/替換,並且對於我的生活而言,如果原始版本仍然是.NET v1.1或者曾被一個先前的遷移項目並升級到v2.x.這很好地訣竅,並確認我們的prod版本仍然是v1.1.4322。 – Developer63 2015-02-20 19:49:55

5

從命令行

DUMPBIN您的DLL/EXE/CLRHEADER

+0

有趣,謝謝。 – 2010-02-22 14:40:55

+2

我收到了一堆神祕的標誌,包括「2.05運行時版本」,但這是一個.NET 4.0程序集。 – 2012-11-30 12:18:41

8

這裏有一個PowerShell相當於另一個答案提出的.NET代碼。使用PowerShell意味着您可以跳過創建和編譯程序集等幾個步驟。

在PowerShell提示符,運行以下命令:

[System.Reflection.Assembly]::LoadFrom("C:\...\MyAssembly.dll").ImageRuntimeVersion 

默認情況下,PowerShell使用.NET運行時V2,所以你會得到組件靶向V4例外。堆棧溢出問題How can I run PowerShell with the .NET 4 runtime?詳細說明如果需要,更改該方法。

4

我建議使用ReflectionOnlyLoadFrom()insted的LoadFrom()

它有一個優點x86機器上運行時,它可以加載x64和IA64組件,而LoadFrom()將無法做到這一點的。

雖然它仍然不會從2.0 powershell加載.Net 4.0程序集。

28

澄清一點...

與所有上述方法的問題是,他們將返回4.0版本,如果組件在.NET framework 4.0,4.5或4.5.1編譯。

在運行時編程弄清楚這個版本使用System.Runtime.Versioning.TargetFrameworkAttribute對於給定程序,例如

方式
using System; 
using System.Linq; 
using System.Reflection; 
using System.Runtime.Versioning; 

...  

object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true); 
var attribute = list.OfType<TargetFrameworkAttribute>().First(); 

Console.WriteLine(attribute.FrameworkName); 
Console.WriteLine(attribute.FrameworkDisplayName); 

將返回

a.FrameworkName ".NETFramework,Version=v4.0" string 
a.FrameworkDisplayName ".NET Framework 4"  string 

a.FrameworkName ".NETFramework,Version=v4.5" string 
a.FrameworkDisplayName ".NET Framework 4.5" string 

a.FrameworkName ".NETFramework,Version=v4.5.1" string 
a.FrameworkDisplayName ".NET Framework 4.5.1" string 
+1

用一個用命令行'csc'編譯的程序試過了,沒有工作(沒有'TargetFrameworkAttribute')。 BTW。您的代碼可以簡化爲: 'System.Runtime.Versioning.TargetFrameworkAttribute a = list.OfType ()。First();' – 0xF 2014-07-08 09:08:53

+0

它只在.NET 4.0及更高版本中可用,並且是的代碼可以簡化。 – 2014-07-08 15:30:59

+0

嘗試使用.NET 4.5'csc',沒有'TargetFrameworkAttribute'。 – 0xF 2014-07-09 12:41:28

1

由於@mistika建議,最好使用ReflectionOnlyLoadFrom()而不是LoadFrom()。這樣做的缺點是在裝有ReflectionOnlyLoadFrom()的程序集上調用GetCustomAttributes()會引發異常。你需要調用GetCustomAttributesData()代替:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath); 
var customAttributes = assembly.GetCustomAttributesData(); 
var targetFramework = customAttributes.FirstOrDefault(attr => attr.AttributeType.Equals(typeof(TargetFrameworkAttribute))); 

var frameworkName = string.Empty; 
var frameworkDisplayName = string.Empty; 
if (null != targetFramework) 
{ 
    if(targetFramework.ConstructorArguments.Any()) 
    { 
     // first argument is the name of the framework. 
     frameworkName = (string)targetFramework.ConstructorArguments[0].Value; 
    } 

    // search for a named argument called "FrameworkDisplayName" 
    var frameworkDisplayNameArg = targetFramework.NamedArguments.FirstOrDefault(arg => arg.MemberName.Equals("FrameworkDisplayName")); 
    if (null != frameworkDisplayNameArg) 
    { 
     frameworkDisplayName = (string)frameworkDisplayNameArg.TypedValue.Value; 
    } 
} 

Console.WriteLine("Framework Name: " + frameworkName); 
Console.WriteLine("Framework Display Name: " + frameworkDisplayName); 
0

如果你想在一個腳本結果,我建議使用的ildasm.exe文本輸出,然後用grep「版本字符串」從輸出。

"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" /text D:\LocalAssemblies\Toolfactory.Core.BaseTypes.dll /noil /headers | find "' Version String" 

注意我有一個'所以find命令不能識別‘版本字符串長度’

-2

試試這個Assembly Information可執行拿到集版本,它告訴你它需要CLR版本,以及其他信息 諸如編譯選項,目標處理器和參考文獻:

enter image description here

+0

這給出了assembly_的版本,而不是運行它所需的.Net版本。 – rymdsmurf 2017-02-23 15:00:09

+0

@rymdsmurf,我的回答確實滿足OP的需求。雖然它沒有提供.Net版本,但它提供了彙編版本,它告訴了它需要的.Net版本是不是它!上面的大部分答案都表明獲得程序集版本,所以你應該向下投票! – yantaq 2017-03-06 18:40:31

+0

您的措辭以及圖片中突出顯示的文字表明您的答案解釋瞭如何檢索原始裝配體的裝配版本(OP中提到的裝配版本)。但是該程序集的版本與其框架依賴關係的版本無關。如果這不是你的意思,也許你應該用另一種方式來制定答案,也許可以替換屏幕截圖。 – rymdsmurf 2017-03-07 10:28:50

1

一個非常好的工具是Telerik的JustDecompile。您可以打開程序集,並且工具顯示他們是否定位到4.5,4.5.1或4.6

相關問題