.NET कोर में ऑपरेटिंग सिस्टम का निर्धारण करें


118

मैं कैसे तय कर सकता हूं कि मेरा .NET कोर ऐप किस ऑपरेटिंग सिस्टम पर चल रहा है? अतीत में मैं इस्तेमाल कर सकता था Environment.OSVersion

यह निर्धारित करने का वर्तमान तरीका क्या है कि मेरा ऐप मैक या विंडोज पर चल रहा है या नहीं?



नहीं वास्तव में जवाब मैं देख रहा था, लेकिन यह अपने आप से पाया।
13

इस लेख को देखें। codepedia.info/…
सतिंदर सिंह

जवाबों:


184

तरीका

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

संभव तर्क

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

उदाहरण

bool isWindows = System.Runtime.InteropServices.RuntimeInformation
                                               .IsOSPlatform(OSPlatform.Windows);

अपडेट करें

Oleksii Vynnychenko द्वारा टिप्पणी के लिए धन्यवाद

आप एक स्ट्रिंग के रूप में ऑपरेटिंग सिस्टम का नाम और संस्करण प्राप्त कर सकते हैं

var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;

जैसे osNameAndVersionहोगाMicrosoft Windows 10.0.10586


4
आप जोड़ सकते हैं कि OS के बारे में अधिक जानकारी प्राप्त करने के लिए उस पैकेज में एक और संपत्ति है: System.Runtime.InteropServices.RuntimeInformation.OSDescription- संस्करण के साथ ओएस का विवरण देता है, आदि
Oleksii Vynnychenko

15
+1 हालांकि मुझे यह जवाब पसंद नहीं है। क्यों वे सिर्फ System.Environment.OSVersion.Platformस्थिरता के लिए लागू नहीं कर सकते ?
लीपी

2
ध्यान दें कि स्थिरांक सभी समर्थित ओएस का प्रतिनिधित्व नहीं करते हैं। अन्य OSes के लिए यह जांचना संभव है IsOSPlatform(OSPlatform.Create("FreeBSD"))कि क्या वे अभी समर्थित हैं या भविष्य में जोड़े जा सकते हैं। हालांकि, यह बहुत स्पष्ट नहीं है कि क्या एक सुरक्षित दृष्टिकोण क्या पारित करने के लिए तार के लिए होगा (उदाहरण के लिए, मामला फर्क पड़ता है, या क्या करता है "bsd"मैच दोनों "FreeBSD"और "NetBSD"?)। इस सुविधा के बारे में चर्चा यहाँ देखें ।
NightOwl888

37

System.Environment.OSVersion.Platform पूर्ण .NET फ्रेमवर्क और मोनो में उपयोग किया जा सकता है लेकिन:

  • मैक ओएस एक्स का पता लगाना मेरे लिए मोनो के तहत लगभग कभी काम नहीं आया
  • इसे .NET कोर में लागू नहीं किया गया है

System.Runtime.InteropServices.RuntimeInformation .NET कोर में इस्तेमाल किया जा सकता है लेकिन:

  • यह पूर्ण .NET फ्रेमवर्क और मोनो में लागू नहीं है
  • यह रनटाइम में प्लेटफ़ॉर्म डिटेक्शन नहीं करता है, बल्कि इसके बजाय हार्डकोड जानकारी का उपयोग करता है
    ( अधिक जानकारी के लिए Corefx समस्या # 3032 देखें)

आप प्लेटफ़ॉर्म को विशिष्ट अप्रबंधित कार्य जैसे कि uname():

  • यह अज्ञात प्लेटफार्मों पर विभाजन दोष का कारण हो सकता है
  • कुछ परियोजनाओं में अनुमति नहीं है

तो मेरा सुझाया गया समाधान (कोड बोले देखें) पहली बार में मज़ेदार लग सकता है:

  • यह 100% प्रबंधित कोड का उपयोग करता है
  • यह .NET, मोनो और .NET कोर में काम करता है
  • यह Pkcs11Interop लाइब्रेरी में अब तक एक आकर्षण की तरह काम करता है
string windir = Environment.GetEnvironmentVariable("windir");
if (!string.IsNullOrEmpty(windir) && windir.Contains(@"\") && Directory.Exists(windir))
{
    _isWindows = true;
}
else if (File.Exists(@"/proc/sys/kernel/ostype"))
{
    string osType = File.ReadAllText(@"/proc/sys/kernel/ostype");
    if (osType.StartsWith("Linux", StringComparison.OrdinalIgnoreCase))
    {
        // Note: Android gets here too
        _isLinux = true;
    }
    else
    {
        throw new UnsupportedPlatformException(osType);
    }
}
else if (File.Exists(@"/System/Library/CoreServices/SystemVersion.plist"))
{
    // Note: iOS gets here too
    _isMacOsX = true;
}
else
{
    throw new UnsupportedPlatformException();
}

1
आपके प्रयास की सराहना करते हैं। काश भविष्य में कुछ स्थिरता हो सकती है।
लीपी

6
System.Runtime.InteropServices.RuntimeInformation पूर्ण .net में अब (नवंबर के बाद से) सही ढंग से काम करना चाहिए, ताकि अब "सही" तरीके से ऐसा लगता है। मोनो के बारे में निश्चित नहीं है, लेकिन चूंकि वे अब .net से कुछ कोड डायरेक्ट ले रहे हैं, क्योंकि यह ओपन सोर्स है, यह वहां काम करने से पहले केवल कुछ समय की बात है, अगर पहले से ही नहीं।
GrandOpener

1
Path.DirectorySeparatorChar का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि इसकी खिड़कियां या * निक्स मशीन।
किरान

InteropServices बहुत अजीब हैं। VStudio और राइडर के भीतर, मुझे कभी-कभी "इस संदर्भ में अज्ञात" मिलता है या यह संकलित होता है। इस असफलता के कारण के बारे में कोई विचार नहीं ...
सालेसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.