多数の DLL を使用する大規模な MFC アプリケーションがあります。ここまでは、vcredist_x86.exe を使用して、MFC と CRT をアンマネージ サイド バイ サイド アセンブリ キャッシュ (C:\Windows\WinSxS) にインストールしてきました。この方法で MFC/CRT をインストールすると、アプリケーションが (クリーンな XP マシンで) 実行されます。
MSDN のドキュメントによると、アプリケーションがインストールされているフォルダーにアセンブリ ファイルをコピーすることで、MFC/CRT をインストールできます。これを単純な MFC アプリケーションでテストしたところ、動作しました。しかし、このアプローチを使用して大規模な MFC アプリケーションを動作させるには問題があります。
この問題は、一部の DLL に以前のバージョンの CRT を参照するマニフェストが含まれていることが原因であると思われます。たとえば、ある DLL には次のマニフェストが含まれています。
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50215.4652" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>
</dependency>
</assembly>
CRT アセンブリのバージョン 8.0.50727.762 をアプリケーションのフォルダーにコピーしています。ご覧のとおり、これは CRT の新しいバージョンです。しかし、何らかの理由で、OS ローダーが上記のマニフェストで DLL をロードできません。同じ CRT アセンブリが WinSxS にインストールされている場合、これは発生しません。DependencyWalker を使用して読み込みをトレースすると、エラー LDR: LdrpWalkImportDescriptor() failed to probe c:\documents and settings\qatest\desktop\test\log4cpp.dll for its manifest, ntstatus 0xc0150002 が表示されます
アセンブリの新しいバージョンをロードするローダーの機能は、プライベート サイド バイ サイド アセンブリを使用している場合は機能しないようですが、アセンブリが WinSxS にインストールされている場合は機能します。
これに対する解決策はありますか?