2009-08-28 18 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似乎清除觸發器配置文件再次被讀取。

相關問題