Определение операционной системы в .NET Core
Как определить, на какой операционной системе работает мое сетевое приложение .net?
В прошлом я мог использовать Environment.OSVersion
.
Каков текущий способ определить, работает ли мое приложение на Mac или Windows.
Ответы
Ответ 1
Метод
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
Возможный аргумент
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
Пример
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows)
Update
Благодаря комментарию Алексея Винниченко
Вы можете получить имя и версию операционной системы в виде строки, используя
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription
например. osNameAndVersion
будет Microsoft Windows 10.0.10586
Ответ 2
System.Environment.OSVersion.Platform
можно использовать в полной версии .NET Framework и Mono, но:
- Обнаружение Mac OS X почти никогда не работало для меня в Mono
- он не реализован в .NET Core
System.Runtime.InteropServices.RuntimeInformation
может использоваться в .NET Core, но:
- он не реализован в полной версии .NET Framework и Mono
- он не выполняет обнаружение платформы во время выполнения, но использует жестко кодированную информацию вместо
(подробнее см. corefx issue # 3032)
Вы могли бы вызывать специальные неуправляемые функции платформы, такие как uname()
, но:
- это может привести к ошибке сегментации на неизвестных платформах.
- не разрешено в некоторых проектах
Итак, мое предложенное решение (см. ниже код) может выглядеть сильным сначала, но:
- использует 100% управляемый код
- он работает в .NET, Mono и .NET Core
- он работает как прелесть до сих пор в Pkcs11Interop library
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();
}