Como posso determinar em qual sistema operacional meu aplicativo .NET Core está sendo executado? No passado, eu poderia usar Environment.OSVersion
.
Qual é a forma atual de determinar se meu aplicativo está sendo executado no Mac ou Windows?
Como posso determinar em qual sistema operacional meu aplicativo .NET Core está sendo executado? No passado, eu poderia usar Environment.OSVersion
.
Qual é a forma atual de determinar se meu aplicativo está sendo executado no Mac ou Windows?
Respostas:
System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform()
OSPlatform.Windows
OSPlatform.OSX
OSPlatform.Linux
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
Graças ao comentário de Oleksii Vynnychenko
Você pode obter o nome e a versão do sistema operacional como uma string usando
var osNameAndVersion = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
Por exemplo, osNameAndVersion
seriaMicrosoft Windows 10.0.10586
System.Runtime.InteropServices.RuntimeInformation.OSDescription
- retorna a descrição do sistema operacional com a versão, etc.
System.Environment.OSVersion.Platform
para consistência?
IsOSPlatform(OSPlatform.Create("FreeBSD"))
se eles são suportados agora ou podem ser adicionados no futuro. No entanto, não está muito claro qual seria uma abordagem segura para quais strings passariam (por exemplo, maiúsculas e minúsculas são importantes ou "bsd"
correspondem a ambos "FreeBSD"
e "NetBSD"
?). Veja a discussão sobre esse recurso aqui .
System.Environment.OSVersion.Platform
pode ser usado em .NET Framework e Mono completos, mas:
System.Runtime.InteropServices.RuntimeInformation
pode ser usado no .NET Core, mas:
Você pode identificar funções não gerenciadas específicas da plataforma, como uname()
:
Portanto, minha solução sugerida (veja o código abaixo) pode parecer tola no início, mas:
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();
}