.NET Core에서 운영 체제 확인


118

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

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



내가 찾던 답은 아니지만 혼자서 찾았습니다.
dknaack

이 기사를 참조하십시오 codepedia.info/…
Satinder singh

답변:


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;

예는 osNameAndVersionMicrosoft Windows 10.0.10586


4
OS에 대한 더 많은 정보를 얻기 위해 추가 할 수 있습니다. 패키지에 다른 속성이 있습니다. System.Runtime.InteropServices.RuntimeInformation.OSDescription-OS에 대한 설명과 버전 등을 반환합니다.
Oleksii Vynnychenko

15
이 답변이 마음에 들지 않지만 +1. System.Environment.OSVersion.Platform일관성을 위해 구현할 수없는 이유는 무엇 입니까?
leppie

2
상수가 지원되는 모든 OS를 나타내는 것은 아닙니다. 현재 IsOSPlatform(OSPlatform.Create("FreeBSD"))지원되는지 또는 향후 추가 될 수 있는지 여부를 사용하여 다른 OS를 검색 할 수 있습니다. 그러나 어떤 문자열을 전달할지에 대한 안전한 접근 방식이 무엇인지 명확하지 않습니다 (예 : 대소 문자가 중요하거나 및 ? "bsd"와 모두 일치 함 ). 여기 에서이 기능에 대한 설명을 참조 하십시오 . "FreeBSD""NetBSD"
NightOwl888 2017 년

37

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();
}

1
당신의 노력에 감사드립니다. 미래에 일관성이 있기를 바랍니다.
leppie

6
System.Runtime.InteropServices.RuntimeInformation은 이제 전체 .net에서 올바르게 작동해야합니다 (11 월 이후), 이제 "올바른"방식으로 받아 들여지고있는 것 같습니다. 모노에 대해서는 확실하지 않지만, 오픈 소스이므로 .net에서 직접 일부 코드를 가져 오기 때문에 아직 작동하지 않는 경우에는 시간 문제 일뿐입니다.
GrandOpener 2017 년

1
Path.DirectorySeparatorChar Windows 또는 * nix 시스템인지 확인하는 데 사용할 수 있습니다.
kiran

InteropServices는 매우 이상합니다. VStudio 및 Rider 내에서 가끔 "Unknown in this context"가 표시되거나 컴파일됩니다. 이 실패의 이유에 대해 전혀 모릅니다 ...
Slesa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.