【问题标题】:Per Application config file bindingRedirect doesn't apply to Dlls每个应用程序配置文件 bindingRedirect 不适用于 Dll
【发布时间】:2009-08-28 15:22:53
【问题描述】:

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

通过这种方法,我成功地让 exe 和 dll 使用不同版本的 comctl32.dll。 exe 使用 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 的非主题版本 5。

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

我也知道从一个主要版本的程序集执行 bindingRedirect 到另一个不是受支持的方案,但我实际上只是使用 commctl32 作为测试机制的一种明显简单的方法。

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

【问题讨论】:

    标签: windows manifest sxs


    【解决方案1】:

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

    我发现注销/登录似乎清除了触发配置文件再次读取。

    【讨论】:

      【解决方案2】:

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

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

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

      full_path_to_dll\dllname.dll.2.config
      

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

      【讨论】:

      • 谢谢,这节省了我几个小时。这在任何地方都有记录吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多