2009-08-28 54 views
3

我创建了一个简单的Win32应用程序来演示UXtheme在XP上包含一个清单依赖于ver 6 commctl32.dll 然后我创建了一个简单的Win32 DLL,使用ISOLATION_AWARE_ENABLED和具有嵌入式清单指定的Comctl32.dll每个应用程序的配置文件bindingRedirect不适用于Dll

的两个版本5和6我成功得到了EXE和DLL使用使用这种方法COMCTL32.DLL的不同版本进行了测试。无论是使用5和DLL版本6的exe,反过来。

于是,我重新设置应用程序和DLL有COMCTL版本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没有每个DLL配置文件不在话下。试图创造一个并不会做任何事情。

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

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

回答

3

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

  • 我用进程监视器跟踪文件的访问,
  • 实现之后访问.manifest的和.config文件来自csrss.exe的不是我自己的过程,
  • 和Windows Vista甚至不会访问.manifest或.config文件,这些文件随后将缓存它们的存在以及exe的日期时间戳。

毕竟,我发现,调用LoadLibrary加载DLL时没有探测一个config文件:

full_path_to_dll\dllname.dll.2.config 

在这个文件绑定重定向将被处理。

+1

谢谢,这救了我小时。这是记录在任何地方? – 2011-03-28 12:58:31

+0

是和不是。它的文件记录在各地。 – 2011-03-28 13:22:38

4

和Windows Vista甚至不会访问,因为它有一个日期 - 时间 戳记的exe一起缓存他们的存在是 后来添加.manifest的或.config文件。

我发现注销/ on似乎清除触发器配置文件再次被读取。

相关问题