目次
概要
アプリケーションが現在実行されているオペレーティングシステム(OS)の種類やバージョン情報を取得する方法です。 標準の System.Environment クラスを使用することで、Windows、Linux、macOSなどのプラットフォーム判別や、詳細なバージョン番号(メジャー、マイナー、ビルド、リビジョン)を確認できます。
仕様(入出力)
- 入力
- なし(実行環境のシステム情報を参照)
- 出力
- プラットフォーム識別子(
PlatformID列挙体) - OSのバージョン文字列(
string) - バージョン番号の内訳(Major, Minor, Build, Revision)
- プラットフォーム識別子(
基本の使い方
Environment.OSVersion プロパティにアクセスするだけで、現在のOS情報を保持するオブジェクトを取得できます。
OperatingSystem os = Environment.OSVersion;
// 例: Unix 13.0.0 (macOS等) や Microsoft Windows NT 10.0.19045.0 など
Console.WriteLine(os.VersionString);
コード全文
OSの基本情報と、バージョン番号の構成要素を個別に取得して表示するコンソールアプリケーションです。
using System;
class Program
{
static void Main()
{
// OS情報の取得
OperatingSystem osInfo = Environment.OSVersion;
Console.WriteLine("=== OS Information ===");
// 1. プラットフォーム識別子 (Win32NT, Unix, MacOSX など)
// 注意: .NET Core/.NET 5以降では、macOSやLinuxは「Unix」と表示されることが多い
Console.WriteLine($"Platform : {osInfo.Platform}");
// 2. バージョン文字列全体
Console.WriteLine($"VersionString: {osInfo.VersionString}");
// 3. バージョン番号の詳細
Version ver = osInfo.Version;
Console.WriteLine($"Major : {ver.Major}");
Console.WriteLine($"Minor : {ver.Minor}");
Console.WriteLine($"Build : {ver.Build}");
Console.WriteLine($"Revision : {ver.Revision}");
// 4. サービスパック情報(空文字の場合あり)
if (!string.IsNullOrEmpty(osInfo.ServicePack))
{
Console.WriteLine($"ServicePack : {osInfo.ServicePack}");
}
}
}
実行結果例(Windows 10/11 の場合)
=== OS Information ===
Platform : Win32NT
VersionString: Microsoft Windows NT 10.0.19045.0
Major : 10
Minor : 0
Build : 19045
Revision : 0
実行結果例(Linux/WSL の場合)
=== OS Information ===
Platform : Unix
VersionString: Unix 5.15.90.1
Major : 5
Minor : 15
Build : 90
Revision : 1
カスタムポイント
- ログ出力への組み込み
- アプリケーション起動時にこの情報をログに出力しておくと、不具合発生時にユーザーの環境(Windows 10なのか11なのか、Linuxのカーネルバージョンは何かなど)を特定するのに役立ちます。
- 分岐処理
osInfo.Platformの値を使って、Windows専用のパス区切り文字や特定コマンドの実行可否を分岐させるロジックに利用できます。
注意点
- Windows 10/11の正確なバージョン
- 古い .NET Framework アプリケーションなどでは、OSがWindows 10や11であっても、アプリケーションマニフェスト(
app.manifest)で互換性を宣言していない場合、Versionプロパティが6.2(Windows 8) などを返すことがあります。正確な値を得るには適切なマニフェスト設定が必要です。
- 古い .NET Framework アプリケーションなどでは、OSがWindows 10や11であっても、アプリケーションマニフェスト(
- Linux/macOSの区別
- .NET Core以降、LinuxとmacOSはどちらも
PlatformID.Unixを返すことが一般的です。厳密に区別したい場合は、後述の「応用」にあるOperatingSystemクラスのメソッドを使用してください。
- .NET Core以降、LinuxとmacOSはどちらも
応用
.NET 5 以降のモダンなOS判定
.NET 5 以降では、System.OperatingSystem クラスにプラットフォーム判定用の便利なメソッドが追加されています。コード内でOS固有の機能を呼び出す前のガード句として推奨されます。
using System;
if (OperatingSystem.IsWindows())
{
Console.WriteLine("これは Windows です。レジストリ操作などが可能です。");
// OperatingSystem.IsWindowsVersionAtLeast(10, 0, 19041) なども使用可能
}
else if (OperatingSystem.IsLinux())
{
Console.WriteLine("これは Linux です。");
}
else if (OperatingSystem.IsMacOS())
{
Console.WriteLine("これは macOS です。");
}
else if (OperatingSystem.IsBrowser())
{
Console.WriteLine("これは Blazor WebAssembly などブラウザ上で実行されています。");
}
まとめ
Environment.OSVersion は手軽にOS情報を取得できる基本的なプロパティですが、クロスプラットフォーム開発(Windows, Linux, macOS)を行う現代のC#環境では、プラットフォームの識別が大まか(Unixでまとめられる等)になることがあります。OSごとの機能分岐を行いたい場合は、.NET 5以降で導入された OperatingSystem.IsWindows() などのメソッドを併用するのがベストプラクティスです。
