.NET Core에서 운영 체제 확인 어떻게 확인할 수 있습니까? 과거에는 Environment.OSVersion. 내 앱이

.NET Core 앱이 실행중인 운영 체제를 어떻게 확인할 수 있습니까? 과거에는 Environment.OSVersion.

내 앱이 Mac 또는 Windows에서 실행 중인지 확인하는 현재 방법은 무엇입니까?



답변

방법

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;

예는 osNameAndVersionMicrosoft Windows 10.0.10586


답변

System.Environment.OSVersion.Platform 전체 .NET Framework 및 Mono에서 사용할 수 있지만 다음과 같습니다.

  • Mac OS X 감지는 Mono에서 거의 작동하지 않았습니다.
  • .NET Core에서 구현되지 않았습니다.

System.Runtime.InteropServices.RuntimeInformation .NET Core에서 사용할 수 있지만 :

  • 전체 .NET Framework 및 Mono에서는 구현되지 않습니다.
  • 런타임에서 플랫폼 감지를 수행하지 않지만 대신 하드 코딩 된 정보를 사용합니다
    (자세한 내용은 corefx 문제 # 3032 참조).

다음과 같은 플랫폼 특정 관리되지 않는 기능을 고정 할 수 있습니다 uname().

  • 알 수없는 플랫폼에서 분할 오류가 발생할 수 있습니다.
  • 일부 프로젝트에서는 허용되지 않습니다.

그래서 내가 제안한 솔루션 (아래 코드 참조)은 처음에는 멋지게 보일 수 있지만 :

  • 100 % 관리 코드를 사용합니다.
  • .NET, Mono 및 .NET Core에서 작동합니다.
  • 지금까지 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();
}


답변