Windows 8.1 でバージョン判別するときの注意点

Windows 8.1 が公開されました!

ということで、Windows 8.1 に関するネタを 1 つ。

Windows 8.1 のバージョン

Windows 8.1 になり、OS バージョンは 6.3 に上がりました。

OS バージョン
Windows Vista 6.0
Windows 7 6.1
Windows 8 6.2
Windows 8.1 6.3 ← New!

Windows 8.1 固有の機能 (例えば、Per-Monitor DPI とか) を使いたい場合などで、実行中の OS が Windows 8.1 かどうか判別するためには、 OS バージョンが 6.3 であるかどうかを確認すればよい、ということになります。

バージョンを取得してみる

というわけで、.NET Framework のアプリケーションでバージョンを取得します。

オーソドックスに、Environment.OSVersion を使いましょう。

バージョンを表示するだけの簡単なコンソールアプリを組みました。

これを、「Visual Studio ホスティング プロセスを有効にする」にチェックを入れた状態 (たぶん、既定の設定) でデバッグ実行します。

スクリーンショット (10)
スクリーンショット (8)

NT バージョン 6.3 を取得できました。

ところが、これを「デバッグなしで実行」をすると…
スクリーンショット (9)

はい、取れません。

Windows 8 のバージョン 6.2 が帰ってきます。

デバッグ実行している間は正しいバージョン 6.3 が取れるのに、リリース ビルドで実行すると正しいバージョンが取れないという、非常にややこしい状況になります。

これは、Win32 API の GetVersion(Ex) 関数を使っても同じです (というか、Environment.OSVersion は内部で GetVersion 関数を呼んでいるので、同じなのは当たり前!)。

対処方法

これは、実はバグでもなんでもなく、意図してこのような動作になっています。

Operating system version changes in Windows 8.1 and Windows Server 2012 R2
http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx

That means that while you can still call the APIs, if your app does not specifically target Windows 8.1, you will get Windows 8 versioning (6.2.0.0).

Windows 8.1 をターゲットとしない限り、Windows 8 のバージョンが返ってくる、というのが仕様のようです。ですので、Windows 8.1 をターゲットとしていることを、マニフェストで宣言します。

Visual Studio 2013 でアプリケーション マニフェスト ファイルを新規追加すると、以下のようにコメント アウトされた状態で既に記述されているので便利です。
SS131024005622KD

マニフェストで Windows 8.1 をターゲットとしていることを宣言した状態で、先ほどと同じく「デバッグなしで実行」すると…
SS131024010120KD

しっかり取得できました。

もちろん、GetVersion(Ex) 関数を使った場合も、同様に Windows 8.1 のバージョン 6.3 を取得できます。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です