我已经构建了一个 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,但这次它不查看winsxs
manifests / 目录。相反,它会查看系统路径和/或将遵守 dll 重定向。这就是问题发生的时候。如果我将系统路径设置为从它开始,c:\windows\winsxs\x86_microsoft.vc90.crt...\
它将加载完全相同的 dll 并且很高兴 - 但如果使用任何其他文件 - 包括完全相同的 dll 的副本 - 但在不同的路径 - 那么整个事情就会爆炸. 它无法处理使用两个不同的文件。
我怎样才能解决这个问题?理想情况下,我喜欢让 dll 的初始魔法加载基于私有程序集,但无论我对清单或 .dll.local 等做什么,在第二次加载 dll 之前,它都不会尊重这一点。
请注意,对于非捆绑 dll(外部依赖项),它始终使用 winsxs MSVCR90.DLL。
我可以通过强制系统路径加载winsxs副本来“修复”我无法使用dll的问题,但这对于可部署的com服务器来说毫无用处!