2010-05-01 6 views
2

배경
응용 프로그램 용 플러그인을 유지 관리하고 있습니다. Visual C++ 2003을 사용하고 있습니다.동일한 프로세스에서 DLL 그룹의 여러 복사본로드 중

플러그인은 여러 개의 DLL로 구성되어 있습니다. 기본 DLL이 있습니다. 응용 프로그램이 LoadLibrary를 사용하여로드하는 것이며, 기본 DLL과 다음 DLL에 의해 사용되는 여러 유틸리티 DLL이 있습니다. 서로.
종속성은 일반적으로 다음과 같이 :

  • plugin.dll -> utilA.dll, utilB.dll
  • utilA.dll -> utilB.dll
  • utilB.dll -> utilA.dll, utilC .dll

사진이 나옵니다.

DLL 간의 종속성 중 일부는로드 시간과 일부 런타임입니다.

모든 DLL 파일은 실행 파일의 디렉토리에 저장됩니다 (요구 사항은 아니며 지금은 어떻게 작동하는지).

문제
새로운 요구 사항에 있습니다 - 응용 프로그램 내에서 플러그인의 여러 인스턴스를 실행하는가.
응용 프로그램은 플러그인의 각 인스턴스를 자체 스레드에서 실행합니다. 즉, 각 스레드는 plugin.dll에서 내 보낸 함수를 호출합니다. 그러나 플러그인의 코드는 스레드로부터 안전합니다. 전역 변수가 많이 있습니다.

불행히도 모든 것을 수정하는 것은 현재 옵션이 아니므로 다중 (최대 3)을로드하는 방법이 필요합니다. 동일한 프로세스에서 플러그인의 DLL 사본.

옵션 1 : 명료 한 이름은 각 파일에 고유 한 이름을 가질 수 있도록
는 각 DLL 파일의 3 개 복사본을 생성 접근. 예 : plugin2.dll, plugin3.dll, utilA1.dll, utilA2.dll, utilA3.dll, utilB1.dll 등. 응용 프로그램은 plugin1.dll, plugin2.dll 및 plugin3.dll을로드합니다. 파일은 실행 파일의 디렉토리에 있습니다.

DLL의 각 그룹이 이름으로 서로를 인식하기 때문에 (상호 의존성이 작동하기 때문에) 컴파일 타임에 이름을 알아야합니다. 즉 DLL을 여러 번 컴파일해야하며 각 출력마다 다릅니다 파일 이름.

매우 복잡하지는 않지만 VS 프로젝트 파일의 복사본을 3 개 만드는 것이 싫고 동일한 파일을 반복해서 컴파일해야하는 것을 좋아하지 않습니다.

옵션 2 : 나란히 어셈블리
가 자신의 디렉토리에있는 DLL 파일의 사본 3 부, 각 그룹을 생성하고, 디렉토리에 어셈블리 매니페스트 파일을 넣어 조립 각 그룹을 정의 접근 , 플러그인의 DLL을 나열합니다.
각 DLL에는 어셈블리를 가리키는 응용 프로그램 매니페스트가 있으므로 로더는 동일한 디렉터리에있는 유틸리티 DLL의 복사본을 찾습니다. LoadLibrary를 사용하여 DLL을로드 할 때 찾을 수 있도록 매니페스트가 포함되어야합니다. VS2003에는 기본 제공 매니페스트 포함 기능이 없으므로 나중에 VS 버전의 작업에서 mt.exe를 사용합니다.

부분적인 성공으로이 접근법을 시도했지만 DLL의로드 시간에는 종속성이 있지만 다른 DLL을로드하는 DLL 함수가 호출 될 때는 그렇지 않습니다.
이 동작은 this article에 따라 예상되는 동작입니다. - DLL의 활성화 컨텍스트는 DLL의로드 시간에만 사용되며 이후에는 비활성화되고 프로세스의 활성화 컨텍스트가 사용됩니다.

편집 : 예상대로 ISOLATION_AWARE_ENABLED 함께 작동 - DLL의 런타임로드는로드하는 DLL의 원래 활성화 컨텍스트를 사용합니다.

질문
다른 옵션이 있습니까? 모든 빠른 & 더러운 솔루션을 수행 할 것입니다. :-)

ISOLATION_AWARE_ENABLED도 VS2003에서 작동합니까? 편집 : 있습니다.

의견을 크게 환영합니다.

감사합니다.

답변

0

ISOLATION_AWARE_ENABLED은 Windows SDK 헤더 파일로 구현되므로 VS2003과 함께 사용할 가치가 없을 것입니다. 그러나 최신 Windows 7 SDK를 다운로드하여 VS2003과 함께 사용할 수 있습니다.

MT를 사용하여 매니페스트를 링크 할 필요가 없습니다. 명시 적 지식이없는 환경에서는 매니페스트를 리소스로 포함 할 수 있습니다.

다음을 DLL 파일의 .rc 파일에 추가하여 매니페스트를 포함시킵니다. (최근에 충분한 플랫폼 SDK와 함께 RT_MANIFEST가 이미 정의되어야한다) :

VS2003와 함께 작동합니까 실제로 ISOLATION_AWARE_ENABLED
#define RT_MANIFEST 24 
#define APP_MANIFEST 1 
#define DLL_MANIFEST 2 

DLL_MANIFEST RT_MANIFEST dllName.dll.embed.manifest 
+0

, 나는 WinSxS에 지원을 포함 할 정도로 최근 있었다 함께 제공되는 SDK를 같아요. .rc 파일을 사용하여 매니페스트를 포함하지 못했습니다. 정보를 제공해 주셔서 감사합니다. – george

관련 문제