0

我已经构建了一个 inproc com 服务器 dll,我可以通过构建实用程序 py2exe 将其打包为一个或多个文件。当我允许所有依赖项保持外部时,我没有问题,但捆绑为 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,但这次它不查看winsxsmanifests / 目录。相反,它会查看系统路径和/或将遵守 dll 重定向。这就是问题发生的时候。如果我将系统路径设置为从它开始,c:\windows\winsxs\x86_microsoft.vc90.crt...\它将加载完全相同的 dll 并且很高兴 - 但如果使用任何其他文件 - 包括完全相同的 dll 的副本 - 但在不同的路径 - 那么整个事情就会爆炸. 它无法处理使用两个不同的文件。

我怎样才能解决这个问题?理想情况下,我喜欢让 dll 的初始魔法加载基于私有程序集,但无论我对清单或 .dll.local 等做什么,在第二次加载 dll 之前,它都不会尊重这一点。

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

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

4

1 回答 1

0

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

你有几个选择

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

2.见代码项目中的这篇文章。VS-2008 [这里] 有一个更新。 2

构建你的 DLL

于 2018-08-15T05:58:58.187 回答