RCW
공용 언어 런타임은 RCW(Runtime Callable Wrapper)라고 하는 프록시를 통해 COM 개체를 노출합니다. RCW는 .NET 클라이언트에 대한 일반 개체인 것 같지만 기본 기능은 .NET 클라이언트와 COM 개체 간의 호출을 마샬링하는 것입니다.
런타임은 해당 개체에 존재하는 참조 수와 관계 없이 각 COM 개체에 대해 RCW를 하나만 만듭니다. 런타임은 각 개체에 대한 프로세스별로 단일 RCW를 유지 관리합니다. 하나의 응용 프로그램 도메인이나 아파트에 RCW를 만든 다음 다른 응용 프로그램 도메인이나 아파트로 참조를 전달하면 첫 번째 개체에 대한 프록시가 사용됩니다. 다음 그림과 같이 다수의 관리되는 클라이언트가 INew 및 INewerany 인터페이스를 노출하는 COM 개체에 대한 참조를 보유할 수 있습니다.
RCW를 사용하여 COM 개체에 액세스
런타임은 형식 라이브러리에서 파생된 메타데이터를 사용하여 호출되는 COM 개체와 해당 개체에 대한 래퍼를 둘 다 만듭니다. 각 RCW는 래핑하는 COM 개체에서 인터페이스 포인터의 캐시를 유지 관리하고 RCW가 더 이상 필요하지 않게 되면 COM 개체에서 참조를 해제합니다. 런타임은 RCW에서 가비지 수집을 수행합니다.
다른 여러 작업 중에서 RCW는 래핑된 개체를 대신하여 관리 코드와 비관리 코드 간의 데이터를 마샬링합니다. 특히 RCW는 클라이언트와 서버 사이에 전달된 데이터가 해당 클라이언트와 서버에서 각각 다르게 표현될 때마다 메서드 인수와 메서드 반환 값의 마샬링을 제공합니다.
표준 래퍼는 기본 제공 마샬링 규칙을 적용합니다. 예를 들어, .NET 클라이언트가 String 형식을 관리되지 않는 개체에 인수의 일부로 전달하는 경우 래퍼는 String 형식을 BSTR 형식으로 변환합니다. COM 개체가 BSTR를 관리되는 호출자에게 반환하면 호출자는 String을 받습니다. 클라이언트와 서버는 둘 다 자신에게 친숙한 데이터를 주고 받습니다. 다른 형식은 변환할 필요가 없습니다. 예를 들어 표준 래퍼는 항상 관리 코드와 비관리 코드 간에 형식을 변환하지 않고 4바이트 정수를 전달합니다.