.NET Coreのオペレーティングシステムを確認する


118

.NET Coreアプリが実行されているオペレーティングシステムを確認するにはどうすればよいですか?以前は使用できましたEnvironment.OSVersion

アプリがMacとWindowsのどちらで実行されているかを確認する現在の方法は何ですか?


stackoverflow.com/a/28664021/1009099これを参照してください
Kovpaev Alexey

本当に探していた答えではありませんが、自分で見つけました。
dknaack

この記事参照してください codepedia.info/...
シンSatinder

回答:


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マシンかを判別できます。
キラン

InteropServicesは非常に奇妙です。VStudioとRider内で、「このコンテキストでは不明」と表示されるか、コンパイルされます。この失敗の理由は
わかり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.