Windowsオペレーティングシステムのコンテキスト[Compatibility@app.manifest]
Windowsタスクマネージャーの「オペレーティングシステムのコンテキスト」およびアプリケーションマニフェストのcompatibilityセクションについて。
タスクマネージャーの「詳細」タブにあるプロセスの一覧に「オペレーティングシステムのコンテキスト」という項目があって、Windows 8.1だと「Windows Vista」「Windows 7」「Windows 8」「Windows 8.1」のいずれかになっているのだけど、これがどういう意味で何を元に判別しているのか、気になったので調べてみた。
→App (executable) manifest - MSDN Windows Dev Center Desktop
どうもこれはWindows 7で追加された互換性のための機能で、Windows Vista以前で動作するように設計されたアプリケーションはWindows Vistaの仕様で動作し、Windows 7で動作するように設計されたアプリケーションはWindows 7の仕様で動作するというもの。具体的には、アプリケーションマニフェストのcompatibilityセクションで、OSバージョン毎に固有のsupportedOS Idを追加することで新しいOSの仕様で動くようになる。アプリケーションマニフェストにcompatibilityセクションを記述していない場合は、Windows Vistaの仕様で動作する。今のところそれぞれの仕様の違いはそれほど大きなものではないようだが、将来のWindowsではさらに仕様変更が増えるかもしれない。
私は今までVS2008でWindowsアプリケーションの開発を行っていたので、アプリケーションマニフェストはrequestedExecutionLevelを記述するものという認識しかなかった。VS2010以降ではアプリケーションマニフェストファイル作成時のテンプレートでcompatibiltyセクションが追加されるようだ。
<application>
<!--このアプリケーションが動作するように設計されている、Windows のすべてのバージョンの一覧。
Windows は最も互換性の高い環境を自動的に選択します。-->
<!--アプリケーションが Windows Vista で動作するように設計されている場合は、次の supportedOS ノードのコメントを解除します-->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->
<!-- アプリケーションが Windows 7 で動作するように設計されている場合は、次の supportedOS ノードのコメントを解除します。-->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
<!--アプリケーションが Windows 8 で動作するように設計されている場合は、次の supportedOS ノードのコメントを解除します-->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->
<!-- Windows 8.1 RTM -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"></supportedOS>-->
</application>
</compatibility>
[EOF]