2010-02-06 46 views
3

我們有一個使用大量DLL的大型MFC應用程序。到目前爲止,我們一直在使用vcredist_x86.exe將MFC和CRT安裝到非託管並行程序集緩存(C:\ Windows \ WinSxS)中。當以這種方式安裝MFC/CRT時,應用程序將運行(在乾淨的XP計算機上)。專用非託管並排組裝問題

根據MSDN文檔,您可以通過將程序集文件複製到您的應用程序安裝到的文件夾來安裝MFC/CRT。我已經用一個簡單的MFC應用程序測試過了,它可以工作。但是我在使用這種方法讓我們的大型MFC應用程序工作時遇到了問題。

看來問題是由某些DLL引起的,例如,一個DLL包含以下清單,該清單引用了早期版本的CRT。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<dependency> 
<dependentAssembly> 
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50215.4652" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> 
</dependentAssembly> 
</dependency> 
</assembly> 

我們正在將CRT程序集的版本8.0.50727.762複製到我們應用程序的文件夾中。正如你可以看到這是CRT的更新版本。但由於某種原因,操作系統加載程序無法加載具有上述清單的DLL。在WinSxS中安裝相同的CRT組件時,不會發生這種情況。當我使用DependencyWalker跟蹤加載時,我得到錯誤LDR:LdrpWalkImportDescriptor()無法爲其清單探測c:\ documents和settings \ qatest \ desktop \ test \ log4cpp.dll,ntstatus 0xc0150002

看起來,的加載程序加載較新版本的程序集時不起作用,但它在將程序集安裝到WinSxS中時可以正常工作。

有沒有解決方案?

+0

我發佈一個相關的問題前一段時間,不能太解決問題。請參閱http://stackoverflow.com/questions/1559490/sidbyside-3rd-party-dll-refers-to-two-versions-of-msvcr80-dll – 2010-03-05 12:49:11

回答

1

我認爲答案歸結於CRT出版商政策。看看例如 c:\windows\winsxs\Manifests\x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_f47e1bd6f6571810.manifest。這指定引用舊版CRT的應用程序應該加載此版本。

無需安裝vcredist即可執行此重定向所需的操作是更改清單或寫入libraryX.dll.config(或可能爲libraryX.dll.2.config)以重定向綁定。

查看我的post獲取配置示例。請注意,您不需要<publisherPolicy apply="no"/>;應用發佈者策略來關閉安全漏洞。

一定要測試不同版本的Windows,如可以的SxS工作稍有不同。