2012-05-24 5 views
0

Visual Studio 2008 Express에서 C++을 사용하고 있습니다.DLL 의존성 버전 충돌

우리는 클라이언트에 바이너리 전용 Windows 라이브러리를 제공하고 있습니다.이 라이브러리는 여러 라이브러리를 사용합니다. 따라서 우리는 우리가 사용하는 dll 파일과 함께 dll 파일을 출하했습니다. 이제 문제는 클라이언트가 우리가 사용하는 라이브러리 중 일부를 사용하지만 다른 버전에서 사용한다는 것입니다. 그러므로 우리는 우리 도서관을 사용할 수 없습니다. 왜냐하면 우리 모두가 의존하는 도서관은 양립 할 수 없기 때문입니다.

기술적으로 나는 두 종속 버전이 모두 프로세스 공간에로드되어야한다고 생각합니다. 그러나, 나는 그들의 응용 프로그램뿐만 아니라 우리의 dll이 동일한 종속성 dll 파일 이름을 찾는 것처럼이를 수행하는 방법을 확신하지 못합니다. 누구든지이 문제를 다루는 최선의/가장 깨끗한 방법은 무엇인지 말해 줄 수 있습니까?

감사합니다.

+1

라이브러리는 DLL 이름으로로드됩니다. 연결하려는 DLL의 이름을 변경하십시오. –

+0

Mahmoud가 말했듯이 파일 이름에 라이브러리 버전 번호를 포함시킵니다 (예 :'msvcr80.dll'). – wallyk

+0

표준로드 시간 연결을 사용하는 경우 행운입니다. 런타임 연결 중 하나 (LoadLibrary/GetProcAddress)를 사용해야하거나 지연로드가있는 일부 트릭을 수행해야합니다. –

답변

0

일반적으로 말하면 작동하지 않습니다. 이것은 타사 DLL 버전이 메모리에로드 될 때 서로 방해 할 수 있기 때문입니다. 예를 들어, 다음과 같은 독점적 인 자원이있을 수 있습니다. 특정 디렉토리에있는 파일. 또는 특정 장치. 문제는 타사 DLL의 제조업체조차 알지 못하기 때문에 광범위한 테스트가 필요하다는 것입니다.

하지만 운이 좋으면 어쨌든 작동합니다. 내 제조법 :

  1. DLL "DTAG.DLL"과 필요한 모든 DLL을 응용 프로그램 디렉토리의 하위 디렉토리에 고정 된 이름으로 입력하십시오. "DTAG_LIB".
  2. 수동으로 가져 오기 라이브러리를 작성하십시오 (DELAYLOAD를 사용하는 다른 가능성이 있습니다). 해당 라이브러리에서 LoadLibraryEx로 DLL을로드하십시오. 절대 경로 "DTAG_LIB \ DTAG.DLL"로 끝나고 LOAD_WITH_ALTERED_SEARCH_PATH 플래그를 제공하십시오. 그러면 Windows는이 디렉토리에서 DTAG.DLL을로드하고 해당 디렉토리에서 필요한 모든 DLL도로드합니다. PATH를 "DTAG_LIB"로 설정하지 마십시오!
  3. 고객이 수동 가져 오기 라이브러리와 연결해야합니다.
0

당신은 제공 할 새로운 DLL을 사용하여이 종류의 문제를 해결할 수 있으며 런타임시 버전 충돌을 처리 할 것입니다. 이는 앱과 그 의존성 사이의 일종의 프록시입니다.

다른 방법으로는 Windows Forwarded Libraries mechanism을 사용하는 것입니다.

포워더는 하나의 DLL에서 이동 기능을 수용 할 수있는 편리한 방법입니다 다른

당신은 몇 가지 예 모듈 정의 (.def) 파일로 전달자를 선언하는 방법, 그리고 #pragma 사용할 수 있습니다

#pragma comment(linker, "/export:function=otherdll.function") 
+0

자세한 내용을 보내 주셔서 감사합니다. :-) – mox