0

IIS 加载旧版 ISAPI 扩展和 IIS 模块,两者都使用同名的 DLL,但是这些 DLL 是不同的(链接到不同版本的第三方)。到目前为止应该没有问题,每个组件(扩展和模块)都驻留在自己的文件夹中,每个都有自己的 DLL 版本,但是当 IIS 启动工作进程并且扩展和模块以某种方式加载时,扩展会尝试加载来自模块文件夹的 DLL。我检查了模块的代码,发现使用 SetDllDirectory 会影响整个过程。瞧,这就是问题所在,我说。在摆脱了这个调用(用适合我需要的 DLL 搜索标志的 LoadLibraryEx 替换)之后,问题仍然存在。最后,我发现自己为这两个 DLL 赋予了唯一的名称,这显然(或没有)解决了问题。然而,它不是干净和优雅的解决方案。有谁知道为什么 IIS 表现出如此奇怪的行为?

运行 Win2008、IIS7.5、ISAPI 扩展 - 本机、C++、VC2010、IIS 模块 - 本机、C++、VS2010,上面有问题的 DLL - C++/CLI,与 .NET3.5 第三方程序集链接。一切都是 x64

4

1 回答 1

0

“你不能在同一个进程中拥有两个同名的“经典”DLL,除非它们被设计为支持 SxS”它与这里所说的相关:我们可以在一个中加载 2 个同名的 DLL过程

EDIT001:5 年后:) 根本原因是 IIS 加载内容的方式。当工作进程启动时,无论如何都会加载 IIS 模块内容,然后是 ISAPI。因此,如果两者都使用相同的 DLL(例如,这两个具有共同的基础设施实现),IIS 模块将首先加载,ISAPI 将不得不使用模块加载的 DLL。因此,您最好为相同版本的 IIS 模块和 ISAPI 保留共享 DLL。

于 2012-07-17T07:53:05.083 回答