我已经构建了一个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服务器来说是毫无用处的!
答案 0 :(得分:0)
原因是您的DLL具有一个清单,该清单告诉模块加载器也在SxS存储中进行搜索。
您有几种选择
有关2.请参见code project中的本文。 VS-2008有一个更新[此处]。 2
构建您的DLL