Расширение ISAPI загружает неверную DLL
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. все х64
1 ответ
"У вас не может быть двух" классических "библиотек DLL с одним и тем же именем в одном процессе, если они не были спроектированы для поддержки SxS". Это соответствует тому, что было сказано здесь: " Могли бы мы загрузить две библиотеки DLL с одним и тем же именем в одну?" процесс
EDIT001: 5 лет спустя:) Основной причиной этого является то, как IIS загружает вещи. Когда рабочий процесс запускается, модуль IIS загружает содержимое в любом случае, а затем ISAPI. Таким образом, в случае, когда оба используют одни и те же DLL (например, эти два имеют общую реализацию инфраструктуры), модуль IIS будет загружен первым, и ISAPI должен будет использовать DLL, загруженные модулем. Таким образом, вам лучше оставить свою общую DLL для модуля IIS и ISAPI одной и той же версии.