यह आसान हुआ करता था, लेकिन Microsoft ने एक ब्रेकिंग परिवर्तन करने का निर्णय लिया: संस्करण 4.5 से पहले , .NET का प्रत्येक संस्करण नीचे की अपनी निर्देशिका C:\Windows\Microsoft.NET\Framework(उपनिर्देशिका v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5और v4.0.30319) में रहता था।
संस्करण 4.5 के बाद से इसे बदल दिया गया है: .NET (यानी 4.5.x, 4.6.x, 4.7.x, 4.8.x, ...) के प्रत्येक संस्करण को एक ही उपनिर्देशिका में स्थापित किया जा रहा है v4.0.30319- इसलिए आप अब सक्षम नहीं हैं में स्थापित .NET संस्करण की जाँच करें Microsoft.NET\Framework।
.NET संस्करण की जाँच करने के लिए, Microsoft ने .NET संस्करण की जाँच की जा रही है, उसके आधार पर दो अलग-अलग नमूना स्क्रिप्ट प्रदान की है, लेकिन मुझे इसके लिए दो भिन्न C # स्क्रिप्ट होना पसंद नहीं है। इसलिए मैंने उन्हें एक में संयोजित करने की कोशिश की, यहाँ GetDotNetVersion.csमैंने जो स्क्रिप्ट बनाई (और इसे 4.7.1 फ्रेमवर्क के लिए अपडेट किया):
using System;
using Microsoft.Win32;
public class GetDotNetVersion
{
public static void Main(string[] args)
{
Console.WriteLine((args != null && args.Length > 0)
? "Command line arguments: " + string.Join(",", args)
: "");
string maxDotNetVersion = GetVersionFromRegistry();
if (String.Compare(maxDotNetVersion, "4.5") >= 0)
{
string v45Plus = GetDotNetVersion.Get45PlusFromRegistry();
if (v45Plus != "") maxDotNetVersion = v45Plus;
}
Console.WriteLine("*** Maximum .NET version number found is: " + maxDotNetVersion + "***");
}
private static string Get45PlusFromRegistry()
{
String dotNetVersion = "";
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
{
if (ndpKey != null && ndpKey.GetValue("Release") != null)
{
dotNetVersion = CheckFor45PlusVersion((int)ndpKey.GetValue("Release"));
Console.WriteLine(".NET Framework Version: " + dotNetVersion);
}
else
{
Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
}
}
return dotNetVersion;
}
private static string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 528040) return "4.8 or later";
if (releaseKey >= 461808) return "4.7.2";
if (releaseKey >= 461308) return "4.7.1";
if (releaseKey >= 460798) return "4.7";
if (releaseKey >= 394802) return "4.6.2";
if (releaseKey >= 394254) return "4.6.1";
if (releaseKey >= 393295) return "4.6";
if ((releaseKey >= 379893)) return "4.5.2";
if ((releaseKey >= 378675)) return "4.5.1";
if ((releaseKey >= 378389)) return "4.5";
return "No 4.5 or later version detected";
}
private static string GetVersionFromRegistry()
{
String maxDotNetVersion = "";
using (RegistryKey ndpKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "")
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
{
foreach (string versionKeyName in ndpKey.GetSubKeyNames())
{
if (versionKeyName.StartsWith("v"))
{
RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
string name = (string)versionKey.GetValue("Version", "");
string sp = versionKey.GetValue("SP", "").ToString();
string install = versionKey.GetValue("Install", "").ToString();
if (install == "")
{
Console.WriteLine(versionKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(versionKeyName + " " + name + " SP" + sp);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
if (name != "")
{
continue;
}
foreach (string subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = (string)subKey.GetValue("Version", "");
if (name != "")
{
sp = subKey.GetValue("SP", "").ToString();
}
install = subKey.GetValue("Install", "").ToString();
if (install == "")
{
Console.WriteLine(versionKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name + " SP" + sp);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else if (install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
}
}
}
}
return maxDotNetVersion;
}
}
मेरी मशीन पर यह आउटपुट:
v2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4
क्लाइंट 4.7.03056
पूर्ण 4.7.03056
v4.0
क्लाइंट 4.0.030
.NET फ्रेमवर्क संस्करण: 4.7.2 या बाद में
*** * अधिकतम .NET संस्करण संख्या मिली: 4.7.2 या बाद में ****
केवल एक चीज जो समय के साथ बनाए रखने की आवश्यकता है, एक निर्माण संख्या है। एक बार 4.7.1 से अधिक .NET संस्करण सामने आता है - जो कि फ़ंक्शन को संशोधित करके आसानी से किया जा सकता है CheckFor45PlusVersion, आपको नए संस्करण के लिए रिलीज़ कुंजी जानने की आवश्यकता है इसे जोड़ सकते हैं। उदाहरण के लिए:
if (releaseKey >= 461308) return "4.7.1 or later";
यह रिलीज़ कुंजी अभी भी नवीनतम है और विंडोज 10 के फॉल क्रिएटर्स अपडेट के लिए मान्य है। यदि आप अभी भी अन्य (पुराने) विंडोज संस्करण चला रहे हैं, तो Microsoft के इस दस्तावेज़ के अनुसार एक और है :
.NET फ्रेमवर्क 4.7.1 अन्य सभी विंडोज ओएस संस्करणों पर स्थापित किया गया है 461310
इसलिए, यदि आपको इसकी आवश्यकता है, तो आपको जोड़ना होगा
if (releaseKey >= 461310) return "4.7.1 or later";
फ़ंक्शन के शीर्ष पर CheckFor45PlusVersion। इसी तरह यह नए संस्करणों के लिए काम करता है। उदाहरण के लिए, मैंने हाल ही में 4.8 के लिए चेक जोड़ा है। आप उन बिल्ड नंबरों को आमतौर पर Microsoft में पा सकते हैं ।
नोट: आपको Visual Studio स्थापित करने की आवश्यकता नहीं है, PowerShell को भी नहीं - आप csc.exeऊपर दी गई स्क्रिप्ट को संकलित करने और चलाने के लिए उपयोग कर सकते हैं , जिसका मैंने यहाँ वर्णन किया है।
अद्यतन: प्रश्न .NET फ्रेमवर्क के बारे में है, पूर्णता के लिए मैं .NET कोर के संस्करण को क्वेरी करने का उल्लेख करना चाहता हूं साथ-साथ उपरोक्त के साथ तुलना , यह आसान है: एक कमांड शेल खोलें और टाइप करें:
dotnet --info Enter
और यह .NET कोर संस्करण संख्या, विंडोज संस्करण और प्रत्येक संबंधित रनटाइम DLL के संस्करणों को भी सूचीबद्ध करेगा। नमूना उत्पादन:
.NET कोर SDK (किसी भी
ग्लोबल .json को दर्शाते हुए ):
संस्करण: 2.1.300
प्रतिबद्ध: adab45bf0c
रनटाइम एनवायरनमेंट:
OS नाम: विंडोज
ओएस संस्करण: 10.0.15063
OS प्लेटफार्म: Windows
RID: win10-x642
पथ: C: \ Program Files \ dotnet \ sdk \ 2.1.300
होस्ट (समर्थन के लिए उपयोगी):
संस्करण: 2.1.0
प्रतिबद्ध: caa7b7e2ba
.NET कोर SDK स्थापित:
1.1.9 [C: \ Program Files \ dotnet \ sdk]
2.1.12 [C: \ प्रोग्राम फ़ाइलें \ dotnet \ sdk]
...
2.1.300 [C: \ Program Files \ dotnet \ sdk]
.NET कोर रनटाइम्स स्थापित:
Microsoft.AspNetCore.All 2.1.0 [C: \ Program
Files \ dotnet \ साझा Microsoft .AspNetCore.All]
...
Microsoft.NETCore.App 2.1.0 [C: \ Program Files \ dotnet \ साझा \ Microsoft.NETCore.App]
अतिरिक्त .NET कोर रनटाइम या SDKs:
https: // aka स्थापित करने के लिए .ms / डॉटनैट-डाउनलोड
नोट है कि
यदि आपको केवल सभी अतिरिक्त जानकारी के बिना संस्करण संख्या की आवश्यकता है, तो आप उपयोग कर सकते हैं
dotnet --version।
एक पर 64 बिट विंडोज पीसी , इसे स्थापित करने के लिए संभव है 86 संस्करण कंधे से कंधा मिलाकर साथ 64 नेट कोर का संस्करण। यदि ऐसा है, तो आपको केवल वह संस्करण मिलेगा जो पर्यावरण चर में पहले आता है PATH। यह विशेष रूप से महत्वपूर्ण है अगर आपको इसे अद्यतित रखने की आवश्यकता है और प्रत्येक संस्करण जानना चाहते हैं। दोनों संस्करणों को क्वेरी करने के लिए, उपयोग करें:
C: \ Program Files \ dotnet \ dotnet.exe --version
3.0.100-pred6-012264
C: \ Program Files (x86) \ dotnet \ dotnet.exe --version
3.0.100-pred6-012264
उपरोक्त उदाहरण में, दोनों समान हैं, लेकिन यदि आप दोनों उदाहरणों को अपडेट करना भूल गए हैं, तो आपको अलग-अलग परिणाम मिल सकते हैं! ध्यान दें कि Program Filesके लिए है 64 बिट संस्करण, और Program Files (x86)है 32 बिट संस्करण।
अपडेट: यदि आप इफ-स्टेटमेंट्स (जैसा कि Microsoft ने सुझाव दिया है) के कैस्केड के बजाय बिल्ड नंबरों को एक सूची में रखना पसंद करते हैं, तो आप इस कोड का उपयोग CheckFor45PlusVersionइसके बजाय कर सकते हैं :
private static string CheckFor45PlusVersion(int releaseKey)
{
var release = new Dictionary<int, string>()
{
{ 378389, "4.5" },
{ 378675, "4.5.1" }, { 379893, "4.5.2" },
{ 393295, "4.6" },
{ 394254, "4.6.1" }, { 394802, "4.6.2" },
{ 460798, "4.7" },
{ 461308, "4.7.1" }, { 461808, "4.7.2" },
{ 528040, "4.8 or later" }
};
int result = -1;
foreach(var k in release.OrderBy(k=>k.Key))
{
if (k.Key <= releaseKey) result = k.Key; else break;
};
return (result > 0) ? release[result] : "No 4.5 or later version detected";
}
Environment.Version()शायद सिर्फ सीएलआर का संस्करण लौटाता है।