Interop
Interop.xxx.dll 파일들은 COM(Components Object Model) 형식의 라이브러리를 .NET 환경에서 사용하기 위한 인터오퍼 라이브러리이다. COM은 플랫폼 간 상호 운용성을 지원하기 위한 마이크로소프트의 기술로, 여러 언어와 환경에서 사용할 수 있는 컴포넌트 기반의 소프트웨어 개발 모델이다.
- COM 컴포넌트와 .NET 언어 간의 통신 지원 : COM은 C++ 등의 언어로 작성된 컴포넌트를 .NET 언어에서 사용할 수 있게 해주는 인터페이스를 제공한다.
- Interop 라이브러리는 이러한 인터페이스를 .NET 에서 호출할 수 있도록 *래핑 하고 변환한다.
- *타입 라이브러리(Typelib)에서 정보 추출 : COM 컴포넌트들은 타입 라이브러리에 정보를 저장하고, Interop 라이브러리는 이 정보를 사용하여 .NET에서 사용 가능한 형식으로 변환한다.
- *P/Invoke(Platform Invocation Services) 호출 간소화 : Interop 라이브러리를 사용하면 P/Invoke를 직접 사용하지 않아도 된다. P/Invoke는 .NET에서 네이티브 코드를 호출하기 위한 기술이며, Interop 라이브러리는 이를 간소화하고 편의성을 제공한다.
즉, Interop 라이브러리를 추가하면 .NET 프로젝트에서 COM 컴포넌트를 쉽게 사용할 수 있도록 도와준다. 이때 나머지 DLL 들은 *‘Interop 라이브러리를 통해 내부적으로 자동으로 로딩’되어서 사용된다. 이러한 메커니즘은 .NET의 *런타임이 COM 컴포넌트와 상호작용할 수 있도록 지원하고 있기 때문이다.
Interop 라이브러리를 통해 내부적으로 작동하는 방법
Interop 라이브러리가 COM 컴포넌트와 .NET 언어 간 상호작용을 도와주는데, 이 도움을 받기 위해서는 .NET 런타임에서 COM 컴포넌트의 사용을 지원해야 한다. .NET은 이를 위해 런타임에
*COM Callable Wrapper(CCW)라는 것을 생성한다.
- Interop 라이브러리 참조 : 먼저, .NET 프로젝트에서 Interop 라이브러리를 참조한다. 이때 Interop 라이브러리는 COM 컴포넌트의 타입 라이브러리(Typelib)로부터 생성되며, 여기에는 COM 컴포넌트의 메서드 및 속성에 대한 정보가 담겨 있다.
- COM Callable Wrapper 생성 : .NET은 COM Callable Wrapper 를 생성합니다. 이는 .NET에서 COM 객체를 감싸고 호출할 수 있게 하는 런타임에서 생성되는 래퍼 클래스입니다. 이 래퍼 클래스는 COM 컴포넌트의 인터페이스를 구현하며, 실제 COM 객체에 대한 호출을 처리한다.
- 나머지 DLL 로딩 : COM Callable Wrapper가 생성되면, 런타임은 COM 컴포넌트가 의존하는 나머지 DLL들을 자동으로 로딩한다. 이것은 COM 컴포넌트의 타입 라이브러리에 명시된 의존성을 해결하기 위한 과정이다.
- 호출 및 상호 작용: .NET 코드에서는 마치 일반적인 .NET 클래스를 사용하듯 COM Callable Wrapper를 사용하여 COM 컴포넌트와 상호 작용할 수 있다. .NET 코드에서 COM 메서드를 호출하면, COM Callable Wrapper를 통해 실제 COM 객체의 메서드가 호출된다.
즉, 나머지 DLL들이 자동으로 로딩되는 것은 .NET 런타임이 COM 컴포넌트의 의존성을 해결하면서 필요한 DLL들을 찾아서 로딩하기 때문이다.
.NET 런타임 — 해결 —> COM 컴포넌트의 의존성 —-> 필요한 DLL들을 찾아서 로딩
CCW(COM Callable Wrapper)
COM 클라이언트가 .NET 개체를 호출하면 공용 언어 런타임은 관리되는 개체와 해당 개체에 대한 CCW(COM 호출 가능 래퍼)를 만든다.
.NET 개체를 직접 참조할 수 없는 COM 클라이언트는 CCW를 관리 개체에 대한 프록시로 사용합니다. 런타임은 해당 서비스를 요청하는 COM 클라이언트 수에 관계없이 관리 개체에 대해 정확히 하나의 CCW를 생성한다. 다음 그림에서 볼 수 있듯 여러 COM 클라이언트는 INW 인터페이스를 노출하는 CCW에 대한 참조를 보유할 수 있다. CCW는 인터페이스를 구현하고 가비지 수집되는 관리 개체에 대한 단일 참조를 보유한다. COM 및 .NET 클라이언트 모두 동일한 관리 개체에 대해 동시에 요청할 수 있다.
COM 호출 가능 래퍼는 .NET 런타임 내에서 실행되는 다른 클래스에 표시되지 않는다.
주요 목적은 관리 코드와 비관리 코드 간의 호출을 마샬링 하는 것이다.
그러나 CCW는 자신이 래핑하는 관리 개체의 개체 ID와 개체 수명도 관리한다.
COM 인터페이스 시뮬레이션
CCW는 COM의 인터페이스 기반 상호 작용 적용과 일관된 방식으로 COM에 표시되는 모든 공용 인터페이스 , 데이터 유형 및 반환 값을 COM 클라이언트에 노출합니다. COM 클라이언트의 경우 .NET 개체에서 메서드를 호출하는 것은 COM 개체에서 메서드를 호출하는 것과 동일합니다.
이러한 원활한 접근 방식을 만들기 위해 CCW는 IUnknown 및 IDispatch 와 같은 기존 COM 인터페이스를 제조한다. 다음 그림에서 볼 수 있듯이 CCW는 래핑하는 .NET 개체에 대한 단일 참조를 유지한다. COM 클라이언트와 .NET 개체는 모두 CCW의 프록시 및 스텁 구성을 통해 서로 상호 작용한다.
.NET 런타임은 관리되는 환경에서 클래스에 의해 명시적으로 구현되는 인터페이스를 노출하는 것 외에도 개체를 대신하여 다음 표에 나열된 COM 인터페이스의 구현을 제공한다. .NET 클래스는 이러한 인터페이스의 자체 구현을 제공하여 기본 동작을 재정의할 수 있다.
그러나 런타임은 항상 IUnknown 및 IDispatch 인터페이스에 대한 구현을 제공한다.
'C#' 카테고리의 다른 글
Binary(이진 파일)의 장점 및 사용 (1) | 2023.12.19 |
---|---|
ASP.NET Core 서비스 라이프타임 종류 및 특징 (0) | 2023.12.14 |
C# 라이브러리 만들기 (1) | 2023.11.28 |
C# Delegate , 제네릭(Generic) (1) | 2023.11.27 |
C# 데이터 형식 (정수형, 실수형, 문자형, 부울린형) (0) | 2023.11.27 |