以前にまとめてから随分と時間が経って、VisualStudioも2012となっているし、Windowsも8.1がプレビューとなっている現在、そろそろWinSxSについても情報更新しておくべきじゃないかと思ったので、この記事を書いています。
以前の記事は、WinSxS問題(2009年)やVisualStudio2010でのWinSxS(2010年)というものを自分で書いたようです。
まず、VisualStudioによる大きな逆目が2010になります。
- VisualStudio2010,2012は、生成されるexeにVCランタイムに関するマニフェストが含まれません。
- VisualStudio2005,2008は、生成されるexeにVCランタイムに関するマニフェストが含まれます。
この挙動に注意する必要があります(2005,2008間でも挙動違いますが…)。
次に、OSについてですが、Windows XPまでは、外部マニフェストが有効です。
それ以降のOS WindowsServer2003からは、外部マニフェストよりも内部マニフェスト(埋め込みマニフェスト)が優先されるため、外部による変更ができません。
(情報元:http://msdn2.microsoft.com/ja-jp/library/ms235342(VS.80).aspx)
このような変更点・注意点がありますが、マイクロソフトからダウンロードできる再頒布ランタイムをインストールすれば、どのOS環境でも気にすることなく配布したexeを実行することが出来ると思います。
しかし!この再頒布ランタイムをインストールしたくない場面というものはあるもので、
例えば以下のシチュエーションでしょうか。
- 開発環境なので恒久的に更新されてしまうVC再頒布ランタイムは入れたくない
- そもそもユーザー権限しかないので、VC再頒布ランタイムをインストールできない
- 一時的に実行したいだけなので、VC再頒布ランタイムをインストールするなどして環境を汚したくない
企業のPCだと実は2が該当したりして、この環境でも動くアプリケーションにしておくのは便利だったりします。
一番簡単な解決方法は自分が作成するアプリケーションを、VCランタイムをスタティックリンクして生成する方法です。
VCでプロジェクト設定を開いて、コード生成の項目で、ランタイムライブラリをマルチスレッド(もしくはマルチスレッドデバッグ)を設定すること、です。これらで統一してexe,dllを作成して配布すれば上記の実行条件を満たすことが出来ます。
続いてマルチスレッドDLLやマルチスレッドデバッグDLLについてですが、これについては次回に続く、ということで。この話は長くなりそうです。