3

ver 6のcommctl32.dllにマニフェストの依存関係を含めることで、XPでUXthemeを示す簡単なWin32アプリケーションを作成しました。次に、簡単なWin32 dllを作成し、でビルドしISOLATION_AWARE_ENABLED、Comctl32のバージョン5と6の両方を指定する埋め込みマニフェストでテストしました。 .dll

このメソッドを使用して、exeとdllで異なるバージョンのcomctl32.dllを使用できるようになりました。5を使用するexeとdllバージョン6の両方、およびその逆。

次に、アプリとdllをリセットして、comctlver5マニフェストの依存関係を設定します。そして、アプリケーション構成ファイルを導入しました:

<?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>

これで、アプリケーションを実行すると、アプリケーションがcommctlv6に明確にリダイレクトされます。XPUXThemeを有効にするとダイアログが明確に表示されます。ただし、dllはリダイレクトされておらず、commctlのテーマのないバージョン5を使用しています。

ドキュメントには、bindingRedirectsを実行するためのdllごとの構成ファイルについての言及はありません。そして、それを作成しようとしても何もしません。

また、アセンブリのあるメジャーバージョンから別のメジャーバージョンにbindingRedirectを実行することはサポートされているシナリオではないことも知っていますが、実際には、メカニズムをテストするための明白な簡単な方法としてcommctl32を使用しています。

dllの依存アセンブリのバージョンをリダイレクトするにはどうすればよいですか?

4

2 に答える 2

4

また、Windows Vistaは、exeの日時スタンプとともに存在をキャッシュするため、後で追加される.manifestまたは.configファイルにもアクセスしません。

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

于 2011-10-20T17:03:21.967 に答える
3

それで、この質問は答えられました。

  • Process Monitorを使用して、ファイルアクセスを追跡しました。
  • .manifestファイルと.configファイルへのアクセスは、私自身のプロセスではなく、csrss.exeからのものであることに気付いた後、
  • また、Windows Vistaは、exeの日時スタンプとともに存在をキャッシュするため、後で追加される.manifestまたは.configファイルにもアクセスしません。

結局のところ、私はLoadLibraryがdllをロードするときに.configファイルをプローブすることを発見しました。

full_path_to_dll\dllname.dll.2.config

このファイルのバインディングリダイレクトが処理されます。

于 2009-08-31T14:09:51.297 に答える