2014-02-12 7 views
1

Interop DLL RCW.Xyz.dll이 있는데 해당 DLL을 찾을 수 없습니다. 이름이 기본 명명 체계 Interop.Xyz.dll을 따르지 않기 때문에 interop 어셈블리의 이름이 단순히 변경된 것 같습니다. (DLL이 Visual Studio에서 기본 이름으로 생성 된 경우에도 DLL에 이름에 공백이 있으면 공백이 없어져서 소스 DLL을 다시 찾을 수 없게됩니다.)리플렉션을 통해 Interop 어셈블리에서 소스 DLL 이름 찾기

어떻게 찾을 수 있습니까? interop 어셈블리 뒤에 COM DLL 이름?

해체 도구를 사용해야한다고 가정합니다. 가급적이면 Reflector 라이센스를 갖고 있지 않기 때문에 dotPeek에서 작동하는 솔루션을 찾고 있습니다. DLL이 설치되어있는 경우

답변

0

COM interop은 반드시 하나의 COM 라이브러리에 대해 하나의 interop 라이브러리를 만들 필요는 없습니다. 이 형식 라이브러리 가져 오기 도구의 기본 동작입니다. 하나의 COM 라이브러리에 대해 여러 COM 라이브러리 또는 여러 interop 어셈블리에 대해 하나의 interop 어셈블리를 제공 할 수도 있습니다.

interop 어셈블리가 COM 라이브러리에도 연결되어 있지 않습니다. 대상 시스템에 소스 라이브러리를 설치하지 않고도 쉽게 전개 할 수 있습니다. 사실, 라이브러리 오브젝트 중 하나의 인스턴스를 작성하는 즉시 실패합니다. interop 어셈블리 안의 개체는 원본을 찾을 때 중요합니다. 그들은 런타임 호출 가능 래퍼 (런타임은 CLR을 의미 함)이라고합니다. 그것이 귀하의 interop 어셈블리가 RCW.Xyz.dll으로 불리는 이유입니다. 적절하게 어셈블리의 개발자는 tlbimp의 /out 스위치를 사용하여 생성했습니다.

라이브러리를 검색하려면 특정 COM 유형이 정의되어 있고 interop 어셈블리 내부에서 클래스 이름을 찾으십시오. Visual Studio의 개체 탐색기를 사용하여 interop 어셈블리를 해체 할 필요가 없습니다. 이러한 어셈블리는 일반적으로 코드를 전혀 정의하지 않습니다. CLR을 만족시키는 메타 데이터 만 제공합니다. 각 클래스는 ComImport 속성과 Guid 속성으로 표시됩니다. 이 GUID를 사용하여 레지스트리에서 클래스를 식별하십시오 (대답에 언급 된대로 HKEY_CLASSES_ROOT\CLSID\{GUID}). Inproc32 키의 기본값은 형식이 정의 된 라이브러리입니다. 이는 inproc COM 서버 (DLL의 경우 COM als가 다른 라이브러리 유형을 지원함)에만 적용됩니다.

위에서 언급했듯이, 이것은 실제로 각 클래스에 대해 수행되어야합니다. 그러나 interop 어셈블리 개발자가 형식 라이브러리 가져 오기 도구를 사용하여 interop 어셈블리를 생성하고 다른 스레드와 병합하거나 수정하지 않은 경우 이전에 언급 한 tlbimp의 기본 동작 때문에 한 유형에서만 수행해야합니다.

1

는, 이러한 단계는 다음과 같습니다

  • dotPeek
  • 에서

    • 를 열고 상호 운용성 어셈블리 CCOMActivatorClass 클래스를 찾아 분해 그것을 CCOMActivatorClass
    • 의 [가이 드] 속성에서
    • regedit.exe을 열고 HKEY_CLASSES_ROOT\CLSID\{GUID}\InprocServer32
    • 으로 이동하십시오. 기본값은 DLL
    • 을 가리켜 야합니다.