2012-07-27 2 views
0

COM 등록을 수행하기 위해 COM dll 및 tlb 파일 (VB.NET에서 개발 된 MyLib. *)을 수집하는 데 열을 사용하고 있습니다. 내 응용 프로그램의 설치 폴더 (예 : INSTALLDIR)에 MyLib.dll 및 MyLib.tlb을 설치하면 모든 것이 잘 작동합니다. 그러나 우리는 다른 버전의 SW를 동일한 컴퓨터에 설치하고 동일한 버전의 COM 구성 요소를 사용하는 경우 dll 복사본을 단 하나만 만들 수 있기 때문에 (각 SW 버전마다 고유 한 버전이 있어야한다고 생각합니다. tlb, 내가 틀렸다면 제발 수정하십시오)을 설치해야합니다. 이제 우리는 다른 폴더, 특히 PROGRAM_FILES \ Common Files \ SHARED_FOLDER_NAME에 MyLib.dll을 설치하려고합니다. 그래서 우리 SW의 한 버전이 제거되면 MyLib.dll은 제거 할 수 없으며 다른 버전에서도 계속 사용할 수 있습니다.WIX : COM dll을 다른 폴더에 설치하면 COM 등록이 실패합니다.

하지만 여기에 문제가 있습니다.이 COM을 등록하면이 DLL을 다른 폴더에 설치 한 후에 더 이상 작동하지 않고 COM 기능을 호출 할 때 지정한 파일을 찾을 수 없다는 메시지가 계속 나타납니다. 등록 실패. WIX 설치 프로그램 프로젝트에서 MyLib.dll에 대한이 폴더를 제외한 모든 것이 동일합니다.

은 첫째로 나는 HKCR \의 CLSID {MYCLSIDs}을 가지고, 그들 각각의 내 COM 클래스 중 하나를 나타냅니다 : 여기

설치 후 레지스트리 구조입니다. "InprocServer32"라는 하위 키에는 Assembly, Class, CodeBase, RuntimeVersion, threadingModel이 있습니다. 그리고 CodeBase는 일반적인 파일 폴더 (작동하지 않음)이거나 MyApp의 설치 폴더 (작동 중)입니다. 이는 dll을 넣은 다른 위치입니다. 나는 Access가 TypeLib만을 볼 수 있기 때문에 {MYCLSIDs}에 또 다른 하위 키 TypeLib이있을 거라고 생각 했었고 TypeLib에서 실제 dll 로의 링크가 있어야한다고 생각했지만 두 경우 모두이 하위 키가 누락되었지만 두 번째 경우는 여전히 작동합니다. 문제가 있습니까?

두 번째로 나는 HKLM \ Software \ Classes \ CLSID {MYCLSID}를 가지고 있습니다. 물론이 키들은 물론 위에서 설명한 것과 같은 구조입니다.

셋째, HKCR {MYPROGIDs는}, 이들은 내 수업 넷째

, TLB 파일의 정보를 포함 HKCR \ TypeLib의 {LIBID}, 단지 ProgID가 있습니다,이 ID는 COM의 조립 GUID에서입니다 구성 요소 프로젝트.

마지막으로 HKEY_CLASSES_ROOT \ Interface {InterfaceID}에는 값이 {00020424-0000-0000-C000-000000000046} 인 ProxyStubClsid32라는 하위 키와 TypeLib라는 값이 있으며이 값은 내 LibID입니다.

앞서 언급 한 것처럼 유일한 차이점은 MyLib.dll이있는 곳을 저장하는 CodeBase입니다. 이를 확인하기 위해 두 가지 테스트를 수행했습니다. MyLib.dll을 공유 폴더에 설치하면 COM 호출이 실패합니다. 그러나 SHARED_FOLDER \ MyLib.dll의 모든 CodeBase 값을 INSTALLDIR \ MyLib.dll로 바꾸고 MyLib.dll을 INSTALLDIR에 복사하면 실제로 작동합니다. 그 반대의 경우, MyLib.dll을 INSTALLDIR (COM이 작동하는 경우)에 설치 한 후 INSTALLDIR \ MyLib.dll에서 CodeBase 값을 SHARED_FOLDER \ MyLib.dll로 변경하고 SHARED_FOLDER에 복사본을 만듭니다. 이번에는 실패합니다. 그래서 설치 위치의 문제 인 것 같습니다. 이것은 COM에 대한 나의 이해와 반대입니다. 그리고 SHARED_FOLDER에 대한 권한 문제가 있다고 생각하지 않습니다. 설치 관리자가 생성 한 폴더에 있기 때문에 잘못 될 수 있습니다.

감사합니다.

답변

0

MyLib.dll이 MyApp 설치 폴더에 설치되어있는 다른 라이브러리를 사용하고있는 것으로 나타났습니다. 그래서 MyLib.dll이 공유 폴더에 설치되어있는 경우 동일한 라이브러리에서 해당 라이브러리를 찾으려고합니다. 물론 실패합니다. 해당 라이브러리를 공유 폴더에도 설치하면 작동합니다.

BTW fulogvw.exe는 어셈블리 로딩 문제를 추적 할 때 매우 유용합니다. 예를 들어 내 경우에는 실패한 로그에서 SHARED_FOLDER의 xxx.dll 파일을로드 할 수 없다고 말하면 xxx.dll은 MyLib.dll이 사용하는 일부 라이브러리이며 MyLib.dll은 내가 볼 때까지 필요로한다는 것을 알지 못했습니다. 일지.

관련 문제