2013-04-22 4 views
8

मेरे पास एक त्वरित प्रश्न है: जब मैं मदद करता हूं-> विजुअल स्टूडियो 2012 में, विंडो इंगित करती है कि .NET का संस्करण मैं 4.5.5070 9 का उपयोग कर रहा हूं। हालांकि, जब मैं निम्नलिखित कोड निष्पादित करता हूं:सिस्टम। पर्यावरण। वर्जन एक गलत मूल्य प्रदान करता है

Console.WriteLine(Environment.Version); 

मुझे संस्करण 4.0.30319.18034 मिलता है। क्या देता है? ट्रॉल्सन के प्रो सी # 5 & .NET 4.5 फ्रेमवर्क, पृष्ठ 81 पर यह बताता है कि संस्करण प्रॉपर्टी .NET प्लेटफ़ॉर्म संस्करण का प्रतिनिधित्व करने वाली ऑब्जेक्ट देता है। क्या यह गलत है? पिछले प्रश्न के धागे से संकेत मिलता है कि यह संपत्ति सीएलआर संस्करण लौटाती है। यदि ऐसा है, तो संस्करण ऑब्जेक्ट का उद्देश्य क्या है (जैसा कि, फ्रेमवर्क संस्करण के विपरीत सीएलआर संस्करण जानने का क्या उपयोग है), और आप वास्तव में फ्रेमवर्क संस्करण को कैसे प्राप्त करते हैं?

उत्तर

17

सीएलआर (सामान्य भाषा रनटाइम) संस्करण 4.0.30319.18034 है। यह 4.0.3031 9 के साथ शुरू होता है क्योंकि .NET 4.5 .NET 4.0 असेंबली का एक इन-प्लेस अपग्रेड है।

4.5 अपडेट पूरी तरह से .NET 4.0 रनटाइम को प्रतिस्थापित करता है और v4.0.30319 पर वास्तविक संस्करण संख्या सेट को छोड़ देता है।

(source 1, source 2)

लेकिन अपने संस्करण संख्या शायद, कुछ अद्यतन के साथ .NET 4.5 का प्रतिनिधित्व करता है के रूप में उपयोगकर्ता डेनियल ने this list से निष्कर्ष निकाला जा सकता है:

कुछ उदाहरण हैं रनटाइम संस्करणों के मैंने देखा है:

  • 4.0.30319.1 = .NE टी 4.0 आरटीएम
  • 4.0.30319.269 = सबसे आम .NET 4.0 संस्करण हम अपने उपयोगकर्ताओं
  • 4.0.30319.544 से एकत्र किए गए आंकड़ों में देख रहे हैं = एक और .NET 4.0 संस्करण कि हमारे उपयोगकर्ताओं के एक छोटे से हिस्से स्थापित किया है
  • 4.0.30319.17626 = .NET 4.5 आर सी
  • 4.0.30319.17929 = .NET 4.5 आरटीएम
  • 4.0.30319.18010 = वर्तमान मेरे Windows 8 मशीन पर संस्करण

, प्रमुख नाबालिग और निर्माण versi संख्याओं में बदलाव नहीं हुआ, इसलिए मुझे लगता है कि उन्होंने नहीं सोचा था कि .NET 4.0 और 4.5 के बीच का अंतर ज्यादातर लोगों के लिए महत्वपूर्ण होगा। .NET 4.0 के लिए अनुप्रयोग जो उम्मीद करते हैं कि कुछ संस्करण 4.0.3031 9 अभी भी .NET 4.5 के तहत अपेक्षित काम करते हैं।


चाहे आप .NET 4.0 या 4.5 के लिए कोड करते हैं, आप सटीक उसी .NET असेंबली के खिलाफ संकलित कर रहे हैं। केवल अंतर यह है कि .NET 4.5 से कुछ नए वर्ग छिपा .NET 4.0 के विरुद्ध संकलित करते समय (जैसे कि वे कभी अस्तित्व में नहीं थे)।

ReflectionContext वर्ग पूरी तरह से हो रहा है: तो .NET 4.0 और 4.5 के बीच अंतर बताने के लिए केवल विश्वसनीय तरीका नहीं बल्कि hackish दृष्टिकोण Christian.K in his post द्वारा प्रस्तावित है कि संस्करण संख्या को शामिल नहीं करता प्रतीत हो रहा है .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 संस्करण लौटाती है? और फ्रेमवर्क संस्करण के विपरीत आपको सीएलआर संस्करण को किस परिस्थिति में जानना होगा? –

+0

@VincentAlegrete मैंने अपनी पोस्ट अपडेट की। – Virtlink

+0

2.0-3.5 के लिए एक ही चीज होती है, वे सीएलआर के सभी 2.0 हैं। –

2

बस मैं सोच रहा था एक अभ्यास के रूप में कैसे विजुअल स्टूडियो .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; 
    } 
} 
संबंधित मुद्दे