2013-04-22 31 views
8

我有一個簡單的問題:當我在Visual Studio 2012中去HELP-> About時,窗口顯示我使用的.NET版本是4.5.50709。但是,當我執行以下代碼:System.Environment.Version提供一個不準確的值

Console.WriteLine(Environment.Version); 

我得到的版本4.0.30319.18034。是什麼賦予了?在Troelsen的Pro C#5 & .NET 4.5 Framework中,它聲明Version屬性返回表示.NET平臺版本的對象。這是不正確的?前一個問題的線程表示此屬性返回CLR版本。如果是這種情況,那麼Version對象的目的是什麼(例如,知道CLR版本與框架版本相比有什麼用處),以及您如何真正獲得框架版本本身?

回答

17

CLR(公共語言運行時)版本是4.0.30319.18034。它從4.0.30319開始,因爲.NET 4.5是.NET 4.0程序集的就地升級。

4.5更新完全取代了.NET 4.0運行時,並將實際版本號設置爲v4.0.30319。

source 1source 2

但是你的版本號可能代表.NET 4.5的一些更新,可能會從this list用戶丹尼爾推斷:

下面是一些例子我見過的運行版本:

  • 4.0.30319.1 = .NE牛逼4.0 RTM
  • 4.0.30319.269 =最常見的.NET 4.0我們從我們的用戶
  • 4.0.30319.544收集的數據看到的版本=我們的用戶的一小部分已經安裝了其他.NET 4.0版本
  • 4.0.30319.17626 = .NET 4.5 RC
  • 4.0.30319.17929 = .NET 4.5 RTM
  • 4.0.30319.18010 =當前版本我的Windows 8機器上

主要的,次要的和構建VERSI數量沒有變化,所以我認爲他們並不認爲.NET 4.0和4.5之間的差異對於大多數人來說足夠大。 .NET 4.0的應用程序預計在某些版本4.0.30319的.NET 4.5下仍可按預期工作。


無論您是爲.NET 4.0還是4.5編寫代碼,都是針對完全相同的.NET程序集進行編譯。唯一不同的是,.NET 4.0中的一些新類在編譯時針對.NET 4.0隱藏了隱藏的(就好像它們從不存在)。因此,唯一可靠的方法告訴.NET 4.0和4.5之間的差別似乎是Christian.K in his post提出了相當hackish的方法,不涉及版本號:

ReflectionContext類似乎是完全新的.NET框架4.5,並方便地住在mscorlib。所以你可以做這樣的事情。

public static bool IsNet45OrNewer() 
{ 
    // Class "ReflectionContext" exists from .NET 4.5 onwards. 
    return Type.GetType("System.Reflection.ReflectionContext", false) != null; 
} 
+0

這是有道理的,但有實際返回的.NET版本,而不是在CLR版本的屬性?在什麼情況下你需要知道CLR版本,而不是框架版本本身? – 2013-04-22 00:28:28

+0

@VincentAlegrete我更新了我的帖子。 – Virtlink 2013-04-22 00:36:40

+0

同樣的事情發生的2.0 - 3.5他們都是CLR的2.0。 – 2013-04-22 00:37:24

2

只是作爲一個練習,我想知道的Visual Studio如何檢索到的.NET版本。您可以查詢註冊表,看看哪個版本的安裝和我想出了這個代碼:

static void Main(string[] args) 
{ 
    Console.WriteLine("The following .NET versions are installed:"); 
    var vers = SearchRegistry(Registry.LocalMachine, "Software\\Microsoft\\NET Framework Setup\\NDP", "Version") 
     .GroupBy(v => v) 
     .Select(v => (string)v.Key) 
     .OrderBy(s => s); 

    foreach (string s in vers) 
     Console.WriteLine(s); 

    Console.WriteLine(string.Format("Newest Installed .NET version: {0}", vers.Last())); 
} 

private static IEnumerable<object> SearchRegistry(RegistryKey root, string subkey, string search) 
{ 
    foreach (string sub in root.OpenSubKey(subkey).GetSubKeyNames()) 
    { 
     foreach (string val in root.OpenSubKey(subkey).OpenSubKey(sub).GetValueNames()) 
      if (val == search) 
       yield return root.OpenSubKey(subkey).OpenSubKey(sub).GetValue(val); 

     foreach (var o in SearchRegistry(root.OpenSubKey(subkey), sub, search)) 
      yield return o; 
    } 
} 
相關問題