3

多数の 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 にインストールされている場合は機能します。

これに対する解決策はありますか?

4

1 に答える 1

1

答えはCRTパブリッシャーポリシーにあると思います。たとえばを見てください c:\windows\winsxs\Manifests\x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_f47e1bd6f6571810.manifest。これは、古いバージョンのCRTを参照するアプリが代わりにこのバージョンをロードする必要があることを指定します。

vcredistをインストールせずにこのリダイレクトを実行するために必要なことは、マニフェストを変更するか、バインディングをリダイレクトするためのlibraryX.dll.config(または場合によっては)を作成することです。libraryX.dll.2.config

設定例については、私の投稿を参照してください。必要ないことに注意してください<publisherPolicy apply="no"/>; パブリッシャーポリシーは、セキュリティホールを閉じるために適用する必要があります。

SxSの動作は少し異なる可能性があるため、必ず異なるバージョンのWindowsでテストしてください。

于 2010-06-29T20:47:01.963 に答える