アプリケーション構成ファイルBindingRedirectはDLLに適用されません
質問
Ver 6 commctl32.dllにマニフェスト依存性を含めることにより、XPでUxhemeを実証するシンプルなwin32アプリケーションを作成しました。その後、単純なwin32 dllを作成し、 ISOLATION_AWARE_ENABLED
, 、comctl32.dllのバージョン5と6の両方を指定する埋め込みマニフェストでテストしました
この方法を使用して、comctl32.dllのさまざまなバージョンを使用するEXEとDLLを正常に取得しました。両方とも5とDLLバージョン6を使用し、その他の方法を使用しています。
次に、アプリとDLLをリセットして、comctl ver 5マニフェスト依存関係を持っています。アプリケーション構成ファイルを導入しました:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<windows>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" processorArchitecture="amd64" publicKeyToken="6595b64144ccf1df"/>
<bindingRedirect oldVersion="5.82.7100.0" newVersion="6.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</windows>
</configuration>
これで、アプリケーションを実行すると、アプリケーションは明らかにCommctl V6にリダイレクトされています - ダイアログはXP UxTheme対応を使用して明確に表示されます。ただし、DLLはリダイレクトされておらず、CommCTLの非テーマVer 5を使用しています。
ドキュメントでbindingRedirectsを実行するためのPER-DLL構成ファイルについては言及されていません。そして、作成しようとすることは何もしません。
また、アセンブリのあるメジャーバージョンから別のメジャーバージョンへの拘束力のあるリデレクトを行うことは、サポートされているシナリオではありませんが、メカニックをテストするための明らかな簡単な方法としてCommCTL32を使用しているだけです。
DLLの従属アセンブリのバージョンをリダイレクトするにはどうすればよいですか?
解決 2
したがって、この質問に答えられました。
- プロセスモニターを使用してファイルアクセスを追跡し、
- .MANIFESTおよび.CONFIGファイルへのアクセスがCSRSから来ていることに気付いた後、私自身のプロセスではなく、
- また、Windows Vistaは、EXEのデートタイムスタンプとともに存在をキャッシュするため、後で追加される.MANIFESTまたは.CONFIGファイルにアクセスしません。
結局のところ、LoadLibraryがDLLをロードするときに.configファイルのプローブがあることを発見しました。
full_path_to_dll\dllname.dll.2.config
このファイルのバインディングリダイレクトが処理されます。
他のヒント
また、Windows Vistaは、EXEのデートタイムスタンプとともに存在をキャッシュするため、後で追加される.MANIFESTまたは.CONFIGファイルにアクセスしません。
ログオフ/オンになると、再び読み取られる構成ファイルのトリガーがクリアされているように見えることがわかりました。