2012-07-16 2 views
0

IIS가 레거시 ISAPI 확장명 및 IIS 모듈을로드합니다.이 두 DLL은 모두 동일한 이름의 DLL을 사용하지만이 DLL은 다릅니다 (다른 버전의 타사와 연결됨). 지금까지 문제가 없어야합니다. 각 구성 요소 (확장 프로그램 및 모듈)는 자체 폴더에 있으며 각 모듈에는 DLL이 있습니다. IIS가 작업자 프로세스를 시작하면 확장 프로그램과 모듈이 어떻게 든로드되어 확장 프로그램이 DLL을 모듈의 폴더에서 가져옵니다. 모듈의 코드를 검사하고 전체 프로세스에 영향을주는 SetDllDirectory의 사용을 발견했습니다. Voila, 이것이 문제입니다. 이 호출을 없애고 (내 요구를 충족시키는 DLL 검색 플래그로 LoadLibraryEx로 대체 됨) 문제가 지속되었습니다. 마지막으로 나는 분명히 (또는 아님)이 문제를 해결하는 두 DLL에 고유 한 이름을 제공하는 것으로 나 자신을 발견했습니다. 그러나 그것은 깨끗하고 우아한 해결책이 아닙니다. IIS가 왜 이상한 행동을 보이는 이유는 누구나 알 수 있습니까?ISAPI 확장명이 잘못된 DLL을로드합니다.

.NET3.5 타사 어셈블리와 연결된 Win2008, IIS7.5, ISAPI 확장 - 네이티브, C++, VC2010, IIS 모듈 - 네이티브, C++, VS2010, 문제가있는 DLL - C++/CLI 위를 실행합니다. 모든 그것은 여기 무슨 말을했는지와 상관 관계 를 "그들이 SXS을 지원하기 위해 설계되었습니다하지 않는 한 동일한 프로세스에서 같은 이름의 DLL을"

+0

Ok, 공식 MSDev 응답 : "SxS를 지원하도록 설계되지 않았다면 동일한 프로세스에서 같은 이름의 두 개의"DLL을 가질 수 없습니다. " – kreuzerkrieg

답변

0

고전 "당신은 두 가지를 가질 수 없습니다"64입니다 : Could we have 2 DLLs with the same name being loaded in one process

EDIT001 : 5 년 후 :) 근본적인 원인은 IIS가로드하는 방식입니다. 작업자 프로세스가 시작되면 IIS 모듈이로드되고 ISAPI가로드됩니다. 따라서 두 DLL이 동일한 DLL을 사용하는 경우 (예를 들어이 두 모듈은 공통 인프라 구현이 있음) IIS 모듈이 먼저로드되고 ISAPI는 모듈에서로드 된 DLL을 사용해야합니다. 따라서 동일한 버전의 IIS 모듈과 ISAPI 모두에 대해 공유 DLL을 유지하는 것이 좋습니다.