.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;
예는 osNameAndVersion
것Microsoft 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();
}