클래스에 대한 기본 마샬링

클래스는 COM interop에 의해서만 마샬링될 수 있으며 항상 인터페이스로 마샬링됩니다. 일부 경우에는 클래스를 마샬링하는 데 사용되는 인터페이스를 클래스 인터페이스라고 합니다. 사용자가 선택한 인터페이스를 사용하여 클래스 인터페이스를 재정의하는 방법에 대한 자세한 내용은 클래스 인터페이스 소개를 참조하십시오.

COM에 클래스 전달

관리되는 클래스를 COM에 전달할 때 interop 마샬러에서는 자동으로 COM 프록시를 사용하여 클래스를 래핑하고 해당 프록시에서 생성한 클래스 인터페이스를 COM 메서드 호출에 전달합니다. 그런 다음 프록시는 클래스 인터페이스에 대한 모든 호출을 관리되는 개체에 다시 위임합니다. 프록시는 해당 클래스에 의해 명시적으로 구현되지 않은 다른 인터페이스도 노출합니다. 프록시는 해당 클래스를 대신하여 자동으로 IUnknownIDispatch 등의 인터페이스를 구현합니다.

.NET 코드에 클래스 전달

coclass는 일반적으로 COM에서 메서드 인수로 사용되지 않습니다. 대개는 coclass 대신 기본 인터페이스가 전달됩니다.

인터페이스를 관리 코드로 전달할 때 interop 마샬러에서는 올바른 래퍼를 사용하여 인터페이스를 래핑하고 해당 래퍼를 관리되는 메서드에 전달합니다. 사용할 래퍼를 결정하는 것은 어려울 수 있습니다. COM 개체의 모든 인스턴스에는 해당 개체가 구현하는 인터페이스의 수에 상관 없이 단 하나의 고유한 래퍼만 있습니다. 예를 들어, 다섯 개의 서로 다른 인터페이스를 구현하는 하나의 COM 개체에는 단 하나의 래퍼만 있습니다. 즉, 동일한 래퍼가 다섯 개의 인터페이스를 모두 노출합니다. COM 개체의 인스턴스가 두 개 만들어진 경우에는 두 개의 래퍼 인스턴스가 만들어집니다.

래퍼가 작동 기간 내내 동일한 형식을 유지하려면 interop 마샬러에서는 개체가 노출하는 인터페이스가 처음으로 마샬러를 통해 전달될 때 올바른 래퍼를 식별해야 합니다. 마샬러에서는 개체가 구현하는 인터페이스 중 하나를 확인하여 개체를 식별합니다.

예를 들어, 마샬러에서는 관리 코드로 전달된 인터페이스를 래핑하는 데 클래스 래퍼가 사용되었는지를 확인합니다. 인터페이스가 마샬러를 통해 처음 전달될 때 마샬러에서는 해당 인터페이스가 알려진 개체에서 온 것인지 검사합니다. 이 검사는 다음의 두 가지 경우에 발생합니다.

  • 인터페이스가 다른 곳에서 COM에 전달된 다른 관리되는 개체에 의해 구현되는 경우. 마샬러에서는 관리되는 개체에서 노출하는 인터페이스를 쉽게 식별할 수 있으며 해당 인터페이스와 구현을 제공하는 관리되는 개체를 일치시킬 수 있습니다. 그런 다음 관리되는 개체가 메서드에 전달되며 래퍼는 필요하지 않습니다.

  • 이미 래핑된 개체가 인터페이스를 구현하는 경우. 이러한 경우를 확인하기 위해 마샬러에서는 개체에서 IUnknown 인터페이스를 쿼리한 다음 반환된 인터페이스를 이미 래핑된 다른 개체의 인터페이스와 비교합니다. 인터페이스가 다른 래퍼의 인터페이스와 같으면 해당 개체에는 동일한 ID가 있는 것이며 기존 래퍼가 메서드에 전달됩니다.

인터페이스가 알려진 개체에서 온 것이 아니면 마샬러에서는 다음을 수행합니다.

  1. 마샬러가 개체에서 IProvideClassInfo2 인터페이스를 쿼리합니다. 이 인터페이스가 있으면 마샬러에서는 IProvideClassInfo2.GetGUID에서 반환된 CLSID를 사용하여 해당 인터페이스를 제공하는 coclass를 식별합니다. CLSID를 사용하는 경우 어셈블리가 이미 등록되어 있으면 마샬러는 레지스트리에서 래퍼를 찾을 수 있습니다.

  2. 마샬러가 인터페이스에서 IProvideClassInfo 인터페이스를 쿼리합니다. 이 인터페이스가 있으면 마샬러는 IProvideClassInfo.GetClassinfo에서 반환된 ITypeInfo를 사용하여 해당 인터페이스를 노출하는 클래스의 CLSID를 확인합니다. 마샬러에서는 CLSID를 사용하여 래퍼에 대한 메타데이터를 찾을 수 있습니다.

  3. 마샬러에서 아직 해당 클래스를 식별할 수 없는 경우에는 System.__ComObject라는 일반적인 래퍼 클래스를 사용하여 인터페이스를 래핑합니다.

참고 항목

개념

Blittable 형식 및 비 Blittable 형식

방향 특성

복사 및 고정

기타 리소스

기본 마샬링 동작