3

我创建了一个简单的 Win32 应用程序,通过包含对版本 6 commctl32.dll 的清单依赖项来演示 XP 上的 UXtheme 然后我创建了一个简单的 Win32 dll,使用 构建它ISOLATION_AWARE_ENABLED,并使用指定 Comctl32 版本 5 和 6 的嵌入式清单对其进行测试.dll

我使用这种方法成功地让 exe 和 dll 使用不同版本的 comctl32.dll。使用 5 的 exe 和 6 版的 dll,反之亦然。

然后,我将应用程序和 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 的非主题版本 5。

文档中没有提到用于执行 bindingRedirects 的 per-dll 配置文件。并且尝试创建一个不会做任何事情。

我也知道从一个主要版本的程序集到另一个版本的绑定重定向不是受支持的场景,但我真的只是使用 commctl32 作为测试机制的一种明显简单的方法。

如何重定向 dll 的依赖程序集的版本?

4

2 回答 2

4

而且 Windows Vista 甚至不会访问稍后添加的 .manifest 或 .config 文件,因为它会缓存它们的存在以及 exe 的日期时间戳。

我发现注销/打开似乎清除了再次读取配置文件的触发器。

于 2011-10-20T17:03:21.967 回答
3

所以,这个问题已经回答了。

  • 我使用进程监视器来跟踪文件访问,
  • 在意识到对 .manifest 和 .config 文件的访问来自 csrss.exe 而不是我自己的进程后,
  • 而且 Windows Vista 甚至不会访问稍后添加的 .manifest 或 .config 文件,因为它会缓存它们的存在以及 exe 的日期时间戳。

毕竟我发现 LoadLibrary 在加载 dll 时确实会探测 .config 文件:

full_path_to_dll\dllname.dll.2.config

将处理此文件中的绑定重定向。

于 2009-08-31T14:09:51.297 回答