.NET Core'da İşletim Sistemini Belirleyin


118

.NET Core uygulamamın hangi işletim sisteminde çalıştığını nasıl belirleyebilirim? Geçmişte kullanabilirdim Environment.OSVersion.

Uygulamamın Mac'te mi yoksa Windows'ta mı çalıştığını belirlemenin şu anki yolu nedir?



Aslında aradığım cevap bu değildi, ama kendim buldum.
dknaack

Bu makaleye bakın codepedia.info/…
Satinder singh

Yanıtlar:


184

Yöntem

System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()

Olası Argüman

OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux

Misal

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

Güncelleme

Oleksii Vynnychenko'nun yorumuna teşekkürler

İşletim sistemi adını ve sürümünü kullanarak bir dize olarak alabilirsiniz.

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

Örneğin osNameAndVersion,Microsoft Windows 10.0.10586


4
İşletim sistemi hakkında daha fazla bilgi almak için bunu ekleyebilirsiniz, bu pakette başka bir özellik vardır: System.Runtime.InteropServices.RuntimeInformation.OSDescription- sürümle işletim sisteminin açıklamasını, vb.
Döndürür

15
Bu cevabı beğenmeme rağmen +1. Neden System.Environment.OSVersion.Platformtutarlılık için uygulayamıyorlar ?
leppie

2
Sabitlerin desteklenen tüm işletim sistemlerini temsil etmediğini unutmayın. Şu IsOSPlatform(OSPlatform.Create("FreeBSD"))anda desteklenip desteklenmediklerini veya gelecekte eklenebileceklerini kullanarak diğer işletim sistemleri için araştırma yapmak mümkündür . Bununla birlikte, hangi dizelerin geçmesi için güvenli bir yaklaşımın ne olacağı çok açık değildir (örneğin, durum önemlidir veya "bsd"her ikisi "FreeBSD"ile eşleşir "NetBSD"mi?). Bu özellikle ilgili tartışmaya buradan bakın .
NightOwl888

37

System.Environment.OSVersion.Platform tam .NET Framework ve Mono'da kullanılabilir ancak:

  • Mac OS X algılama, Mono altında neredeyse hiç çalışmadı
  • .NET Core'da uygulanmaz

System.Runtime.InteropServices.RuntimeInformation .NET Core'da kullanılabilir ancak:

  • tam .NET Framework ve Mono'da uygulanmaz
  • çalışma zamanında platform algılama gerçekleştirmez ancak bunun yerine kodlanmış bilgileri kullanır
    ( daha fazla ayrıntı için corefx sorunu # 3032'ye bakın)

Platforma özgü yönetilmeyen işlevleri örneğin, uname()ancak:

  • bilinmeyen platformlarda segmentasyon hatasına neden olabilir
  • bazı projelerde izin verilmiyor

Bu yüzden önerdiğim çözüm (aşağıdaki koda bakın) ilk bakışta mantıklı görünebilir ancak:

  • % 100 yönetilen kod kullanır
  • .NET, Mono ve .NET Core'da çalışır
  • Pkcs11Interop kitaplığında şimdiye kadar bir cazibe gibi çalışıyor
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
Çabanız için teşekkür ederiz. Keşke gelecekte biraz tutarlılık olsaydı.
leppie

6
System.Runtime.InteropServices.RuntimeInformation şu anda tam .net'te doğru şekilde çalışmalıdır (Kasım ayından beri), bu nedenle şu anda kabul edilen "doğru" yol gibi görünüyor. Mono hakkında emin değilim, ancak şimdi açık kaynak olduğu için .net'ten doğrudan bazı kodlar aldıklarından, orada çalışmadan önce, yalnızca bir zaman meselesi.
GrandOpener

1
Path.DirectorySeparatorChar Bir pencere mi yoksa * nix makinesi mi olduğunu belirlemek için kullanılabilir.
kiran

InteropServices çok tuhaf. VStudio ve Rider içinde, bazen "Bu bağlamda bilinmeyen" mesajı alıyorum veya derliyor. Bu başarısızlığın nedeni hakkında hiçbir fikrim yok ...
Slesa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.