1. ホーム
  2. c#

WindowsやLinuxなど、条件付きコンパイル文を使わずに、実行時にOSのバージョンを確認する方法

2023-11-22 01:35:40

質問

C# コードがどのプラットフォームで実行されているかを判断するにはどうしたらよいでしょうか。たとえば、Linux で実行されているのか、それとも Windows で実行されているのか、などです。

Windows と Linux プラットフォームをターゲットにするために構築したい C# Windows アプリケーションがあります。

これまで私は、同じソース コード ファイルのセットを指す 2 つのプロジェクト ファイルを作成しました。次に、条件付きコンパイル ステートメントを使用して、プロジェクトの 1 つである LINUX .

実際のコードで違いがあるところは、条件付きコンパイル文などを使っています。

#if (LINUX)
    ' Do something
#endif

もっと良い方法はないでしょうか?プロジェクトファイルを2つ持ちたくはないのですが。

どのように解決するのですか?

[ 編集後記 : この回答は、.NET 4.7.1 以前、または .NET Core 用の Windows Compatibility Pack がリリースされる以前に適用可能でした。現在のベストアンサーは Alex Sanséau の Stack Overflow の質問へ 条件付きコンパイルステートメントを使用せずに、Windows または Linux などの実行時に OS バージョンをチェックする方法 .]

実行プラットフォームを検出するには System.Environment.OSVersion.Platform :

public static bool IsLinux
{
    get
    {
        int p = (int) Environment.OSVersion.Platform;
        return (p == 4) || (p == 6) || (p == 128);
    }
}

からの Mono FAQ :

<ブロッククオート

実行プラットフォームの検出方法

実行プラットフォームを検出するには System.Environment.OSVersion.Platform の値で検出できます。しかし、Unix プラットフォームを正しく検出するには、すべてのケースで、もう少し作業が必要です。フレームワークの最初のバージョン (1.0 と 1.1) には PlatformID の値が含まれていなかったため、Mono は 128 という値を使用していました。新しいフレームワーク 2.0 では PlatformID enum に Unix が追加されましたが、悲しいことに、異なる値が使用されました。4 と .NET の新しいバージョンでは、Unix と macOS を区別し、macOS に対してさらに別の値 6 を導入しました。

これは、Unix プラットフォーム上で実行されているコードを適切に検出するために、3 つの値 (4、6、128) をチェックする必要があることを意味します。これにより、Mono CLR 1.x ランタイム、および Mono と Microsoft CLR 2.x ランタイムの両方で実行されたときに、検出コードが期待どおりに動作することが保証されます。