WindowsやLinuxなど、条件付きコンパイル文を使わずに、実行時にOSのバージョンを確認する方法
質問
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 ランタイムの両方で実行されたときに、検出コードが期待どおりに動作することが保証されます。
関連
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Windowsでlocalhostのポートを使用中のプロセスを強制終了するにはどうすればよいですか?
-
[解決済み] Windowsのコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?
-
[解決済み] アセンブリファイルのバージョンを取得する方法
-
[解決済み] Visual Studioの「Any CPU」ターゲットはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない