Windows7とVisualStudio2010、ServicePack1を搭載した新しくインストールした開発マシンがあります。
私たちのソリューションには、いくつかのアプリケーションで使用されるC++DLLがあります。
リリース構成ではすべてが正常に機能しますが、デバッグ構成では、アプリケーションの1つを実行しようとすると、アプリケーションを正しく起動できなかったというエラーダイアログが表示されます。
これは、C++DLLのSxS構成に問題があることがわかりました。何らかの理由で、DLLのマニフェストには次の参照が含まれています。
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
また、私のマシンには、VC90ランタイムライブラリのデバッグバージョンがインストールされていません。
以前にも同様の問題が発生したため、使用している外部ライブラリが開発に使用しているのと同じVSバージョンでコンパイルされていることを常に確認します。
しかし、どこかにVC90DebugCRTへの参照があるようです。外部ライブラリでDependencyWalkerとPeStudioを使用してそれを理解しようとしましたが、VC90DebugCRTDllへの参照がどこにも見つかりませんでした。
Dllのリンカー設定でマニフェストファイルの生成を無効にすることで、実際に問題を修正しました。したがって、VC90 DebugCRTは、実際にはアプリケーションを実行するために必要ではありませんが、とにかく何らかの形で引き込まれます。
マニフェストファイルに含める参照をビルドプロセス中にVSがどのように決定し、この参照がどこから来たのかをどのように診断できるのか、今疑問に思っていました。