IIS加载旧的ISAPI扩展和IIS模块,都使用具有相同名称的DLL,但这些DLL是不同的(链接到不同版本的第三方)。到目前为止应该没有问题,每个组件(扩展和模块)都驻留在他们自己的文件夹中,每个组件都有自己的DLL版本,但是当IIS启动工作进程和扩展并且模块以某种方式加载时,扩展尝试加载来自模块文件夹的DLL。我检查了模块的代码,发现使用了影响整个过程的SetDllDirectory。瞧,这是问题,我说。在摆脱这个调用(用LoadLibraryEx替换为DLL搜索标志,满足我的需求)之后问题仍然存在。最后,我发现自己为这两个DLL提供了唯一的名称,显然(或不)解决了这个问题。然而,它不是干净和优雅的解决方案。有谁知道为什么IIS表现出如此奇怪的行为?
运行Win2008,IIS7.5,ISAPI扩展 - 本机,C ++,VC2010,IIS模块 - 本机,C ++,VS2010,以上有问题的DLL - C ++ / CLI,与.NET3.5第三方程序集链接。 一切都是x64
答案 0 :(得分:0)
“你不能在同一个进程中拥有两个同名的”经典“DLL,除非它们被设计为支持SxS” 它与此处所述相关:Could we have 2 DLLs with the same name being loaded in one process
EDIT001: 5年后:)这的根本原因是IIS加载东西的方式。当工作进程启动时,IIS模块的东西在任何情况下都会被加载,然后是ISAPI。因此,如果两个使用相同的DLL(例如这两个具有共同的基础结构实现),IIS模块将首先加载,ISAPI将必须使用由模块加载的DLL。因此,最好保留同一版本的IIS模块和ISAPI的共享DLL。