2016-09-07 6 views
0

"클래스 라이브러리"C# 프로젝트를 만든 다음 VB6을 사용하여 만든 사용자 지정 COM DLL에 대한 참조를 추가하면 Visual Studio 2015에서 VS가 자동으로 모든 (?) COM VB6 DLL이에 의존한다는 참조.중첩 된 COM 참조 가져 오기

어떻게하면 되나요? 어떻게 그 참조가 정적인지 파악할 수 있습니까?

주 - VB6 DLL은 "초기 바인딩"을 사용하지만 기존의 "C"스타일 DLL에서 볼 수있는 것처럼 COM 항목에 대한 가져 오기 테이블과 동일한 기능이 없습니다.

답변

0

실제로 모든 종속성을 정적으로 분석하지 않는다고 생각합니다.

필자는 DLL의 공개 API에 포함 된 COM 참조를 추가한다고 생각합니다. 이것들은 명백하게 DLL의 일부인 typelib에서 볼 수 있습니다.

아마도 내부적으로 사용되지만 공개 인터페이스에는 사용되지 않는 다른 종속성은 무시됩니다.

6

실제로 유형 라이브러리에 대한 참조가 추가됩니다. DLL 내부에 리소스로 포함됩니다. 파일> 열기> 파일을 사용할 때 DLL을 선택하고 TYPELIB 노드를 열 때이 파일을 볼 수 있습니다. 노출 된 인터페이스 및 클래스의 유형 정의를 나열한 .NET 어셈블리에서 메타 데이터와 동일한 역할을합니다. 바이너리 형식이며 OleView.exe 유틸리티로 디 컴파일 할 수 있습니다.

또한 종속성 정보가있는 레지스트리는 종속 형 라이브러리 (HKLM \ Software \ Wow6432Node \ Classes \ Typelib 키)를 찾는 데 도움이됩니다. GAC가 .NET에서하는 역할과 거의 같습니다. COM은 다른 사람들과 마찬가지로 .NET과 다르지 않습니다. 첫 번째 버전의 CLR은 Microsoft의 COM + 그룹에서 만들어졌습니다. COM과 관련된 등록 및 DLL 지옥 문제를 제거하는 것은 할 일 목록의 맨 위에있었습니다.

유형 라이브러리는 정확히 유산이 아니며 새로운 WinRT (일명 UWP, 일명 현대 UI)에서 중요한 역할을합니다. 핵심에 COM 기반, 잘 숨겨져 있습니다. 그러나 오래된 형식은 .winmd 형식으로 대체 된 제한으로 인해 폐기되었습니다. .NET 메타 데이터 형식과 정확히 동일합니다. 모든 .NET 디 컴파일러는 해당 내용을 표시 할 수 있습니다.

+0

* 종속성 정보도 포함되어 있으므로 레지스트리에서 종속 형 라이브러리 (HKLM \ Software \ Wow6432Node \ Classes \ Typelib 키)를 찾을 수 있습니다. * -이 종속성 정보는 어디에 있습니까? – acelent

+0

형식 라이브러리에 있습니다. Oleview.exe를 사용하여 importlib() 문을 봅니다. –

+0

흠, 실제로 TLB는 가져온 라이브러리를 참조합니다. 그러나 tlbimp.exe & co. 'ITypeLib'에서 얻을 수있는 데이터를 순회하는 것만 보입니다. ITypeLib는 ITypeInfo (예 : 상속, 메소드 인수, 메소드 반환 유형 또는 필드 유형)가 추가 된 인터페이스, 구조체 등의 ITypeInfo를 반환합니다. 본질적으로'ITypeInfo :: GetContainingTypeLib'을 통해 다른 타입 라이브러리에 포함되어있다. – acelent

1

Visual Studio 형식 라이브러리 가져 오기 도구가 형식 라이브러리 종속성을 추적하는 이유는 .NET에 매핑 할 형식 정보를 수집하기 위해서입니다.

형식 라이브러리에는 직접 종속성 정보가 없습니다. 그래서 이것은 매우 좋은 질문입니다 : 타입 라이브러리 의존성을 추적하는 방법?

형 라이브러리 의존성을 검출하기 만 가능한 방법은 선언 형 라이브러리 내용의 유형을 참조하는 것이다.

예를 들어, 유형 라이브러리가 메소드 서명에서 IXMLDOMDocument을 참조하면 유형 정보 레코드에 기록됩니다.

형식 라이브러리를로드하고 ITypeLib을 가져 와서 ITypeInfo을 반복적으로 열거하여 형식 라이브러리를 크롤링 할 수 있습니다.

결국이 레코드가 표시됩니다. 그런 다음 형식의 포함 형식 라이브러리 ID를 ITypeInfo::GetContainingTypeLib 통해 가져올 수 있습니다. 다른 유형 라이브러리를 참조하는 경우 종속성을 발견했습니다.

크롤러는로드 할 유형 라이브러리가 없어 질 때까지 종속성을 계속 추적 할 수 있습니다.

엄격하게 필요한 유형 집합을 찾기 위해 모든 유형 라이브러리의 모든 유형을 크롤링 할 필요는 없지만 형식 라이브러리 가져 오기 도구는 형식 라이브러리 정보를 .NET 유형 정보 및 메타 데이터 어셈블리로 미러링하므로 형식 라이브러리를 모두 가져옵니다. 구현하기 쉽고 설명과 이해를 돕고 루트 유형 라이브러리의 컨텍스트 외부에서 출력을 재사용 할 수 있습니다.

초기 바인딩을 사용하지 않은 경우 유형 라이브러리에 IDispatch, IUnknown 및/또는 VARIANT이 표시되어 종속성을 감지하지 못하게됩니다.

격리 된 응용 프로그램에서 등록이 필요없는 COM을 사용하여 종속성을 정렬 할 수 있지만 여전히 적절한 종속성 트리 일 필요는 없습니다. 하나의 매니페스트에 모든 종속성을 기술 할 수 있습니다.

그리고 type library! = DLL을 기억하십시오. 형식 라이브러리는 DLL 또는 자체 TLB 파일에 리소스로 포함될 수 있습니다.

그래서,이 모든 이야기에 대한 유형 종속되지 클래스/컴포넌트 또는 다른 런타임 종속성입니다.

관련 문제