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 を使いましょう。
バージョンを表示するだけの簡単なコンソールアプリを組みました。
class Program { static void Main(string[] args) { Console.WriteLine(Environment.OSVersion); Console.Read(); } }
これを、「Visual Studio ホスティング プロセスを有効にする」にチェックを入れた状態 (たぶん、既定の設定) でデバッグ実行します。
NT バージョン 6.3 を取得できました。
はい、取れません。
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.aspxThat 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 をターゲットとしていることを、マニフェストで宣言します。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> </application> </compatibility>
Visual Studio 2013 でアプリケーション マニフェスト ファイルを新規追加すると、以下のようにコメント アウトされた状態で既に記述されているので便利です。
マニフェストで Windows 8.1 をターゲットとしていることを宣言した状態で、先ほどと同じく「デバッグなしで実行」すると…
しっかり取得できました。
もちろん、GetVersion(Ex) 関数を使った場合も、同様に Windows 8.1 のバージョン 6.3 を取得できます。