私有非托管并排装配问题

时间:2010-02-06 00:06:37

标签: msvcrt side-by-side

我们有一个使用大量DLL的大型MFC应用程序。到目前为止,我们一直在使用vcredist_x86.exe将MFC和CRT安装到非托管并排程序集缓存(C:\ Windows \ WinSxS)中。当以这种方式安装MFC / CRT时,应用程序运行(在干净的XP机器上)。

根据MSDN文档,您可以通过将程序集文件复制到安装了应用程序的文件夹中来安装MFC / CRT。我用一个简单的MFC应用程序测试了它,它的工作原理。但是我在使用这种方法使大型MFC应用程序工作时遇到了问题。

似乎问题是由一些具有引用早期版本CRT的清单的DLL引起的,例如,一个DLL包含以下清单。

<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的新版本。但由于某种原因,OS加载程序无法使用上述清单加载DLL。在WinSxS中安装相同的CRT程序集时,不会发生这种情况。当我使用DependencyWalker跟踪加载时,我得到错误LDR:LdrpWalkImportDescriptor()无法探测c:\ documents和settings \ qatest \ desktop \ test \ log4cpp.dll的清单,ntstatus 0xc0150002

当使用私有并排程序集时,加载程序加载较新版本程序集的能力似乎不起作用,但是当程序集安装到WinSxS中时它可以正常工作。

有解决方法吗?

1 个答案:

答案 0 :(得分: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的工作方式可能略有不同。