アプリケーション構成ファイルBindingRedirectはDLLに適用されません

StackOverflow https://stackoverflow.com/questions/1347713

  •  20-09-2019
  •  | 
  •  

質問

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ファイルにアクセスしません。

ログオフ/オンになると、再び読み取られる構成ファイルのトリガーがクリアされているように見えることがわかりました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top