使用Microsoft.VC90.CRT摆脱DLL Hell?

时间:2018-08-14 14:42:02

标签: dll com assemblies py2exe winsxs

我已经构建了一个Inproc com服务器dll,可以通过构建实用程序py2exe将其打包为1个文件或多个文件。当我允许所有依赖项保持在外部时,我没有任何问题,但是将其捆绑为1个文件会产生问题。

使用dll(通过它注册或实例化com对象)时,无论我做什么,它都会立即从路径MSVCR90.DLL加载c:\windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6871_none_50944e7cbcb706e5\MSVCR90.DLL,我无法更改它。我找不到任何信息(使用Dependency Walker)来指示是什么原因导致加载该信息。只是神奇地发生了...

然后,稍后通过显式调用LoadLibraryA("MSVCR90.dll")(某些py2exe黑盒的一部分?)再次加载该dll,但这次它不查找winsxs清单/目录。相反,它查找系统路径和/或将遵循dll重定向。那是问题发生的时间。如果我将系统路径设置为以c:\windows\winsxs\x86_microsoft.vc90.crt...\开头,它将加载完全相同的dll并感到高兴-但如果使用了其他文件-包括完全相同的dll的副本-但路径不同-然后整个事情都炸了。无法使用两个不同的文件。

我该如何解决?理想情况下,我喜欢使DLL的初始魔术加载依靠私有程序集进行,但是无论我对manifests还是.dll.local等做什么,在第二次dll加载发生之前,它都不会尊重。 >

请注意,对于非捆绑的dll(外部依赖项),它始终使用winsxs MSVCR90.DLL。

我可以通过强制系统路径加载winsxs副本来“修复”我无法使用dll的问题,但这对于可部署的com服务器来说是毫无用处的!

1 个答案:

答案 0 :(得分:0)

原因是您的DLL具有一个清单,该清单告诉模块加载器也在SxS存储中进行搜索。

您有几种选择

  1. 使用静态链接构建DLL。不使用任何MFC-DLL(请参阅项目设置)
  2. 不要为DLL使用并排清单,而仍然使用MFC DLL。但是请注意,您必须将这些DLL与DLL一起放在本地路径中(请参阅DLL搜索顺序文档)
  3. 使用更高版本的VS。 VS的更高版本不再使用SxS存储,并且这些DLL也不再有清单。

有关2.请参见code project中的本文。 VS-2008有一个更新[此处]。 2

构建您的DLL

相关问题