Interop 마샬링 개요
업데이트: 2007년 11월
대부분의 데이터 형식에는 관리되는 메모리와 관리되지 않는 메모리 모두에서 공통되는 표현이 있습니다. interop 마샬러에서는 이러한 형식을 자동으로 처리합니다. 다른 형식은 모호하거나, 관리되는 메모리에서 전혀 표현되지 않을 수 있습니다.
모호한 형식에는 하나의 관리되는 형식에 매핑되는 여러 개의 관리되지 않는 표현이 있거나, 배열 크기 등의 형식 정보가 누락되었을 수 있습니다. 모호한 형식을 위해 마샬러에서는 기본 표현과 대체 표현을 제공하므로 여러 개의 표현이 있을 수 있습니다. 모호한 형식을 마샬링하는 방법에 대해서는 사용자가 마샬러에 명시적으로 지시할 수 있습니다.
이 항목에서는 우선 플랫폼 호출과 COM interop 프로그래밍 모델에 대해 살펴 봅니다. 하위 항목인 마샬링 및 COM 아파트에서는 interop 마샬링과 COM 마샬링의 통합 방법에 대해 설명합니다. 그런 다음 하위 항목인 원격 호출 마샬링에서는 분산 환경에서의 마샬러 작동 방식에 대해 설명합니다.
플랫폼 호출 및 COM Interop 모델
공용 언어 런타임에서는 비관리 코드와의 상호 운용을 위한 다음의 두 가지 메커니즘을 제공합니다.
플랫폼 호출 - 관리되지 않는 라이브러리에서 내보낸 함수를 관리 코드에서 호출할 수 있도록 합니다.
COM interop - 인터페이스를 통해 관리 코드와 COM 개체가 상호 작용할 수 있도록 합니다.
플랫폼 호출과 COM interop 모두 interop 마샬링을 사용하여 호출자와 호출 수신자 간에 메서드 인수를 정확하게 이동합니다. 다음 그림에서 보여 주는 것과 같이, 콜백 함수가 관련된 경우를 제외하고 플랫폼 호출 메서드를 호출하면 관리 코드에서 비관리 코드로 진행되며 반대로는 진행되지 않습니다. P/Invoke 호출의 경우에는 관리 코드에서 비관리 코드로만 호출이 진행될 수 있으며 데이터는 In 또는 Out 매개 변수처럼 양방향으로 전달될 수 있습니다. COM interop 메서드 호출은 둘 중 한 방향으로 진행될 수 있습니다.
플랫폼 호출 및 COM interop 호출 흐름
최하위 수준에서는 두 메커니즘이 모두 동일한 interop 마샬링 서비스를 사용하지만 일부 데이터 형식은 COM interop 또는 플랫폼 호출에서 단독으로 지원됩니다. 자세한 내용은 기본 마샬링 동작을 참조하십시오.
마샬링 및 COM 아파트
interop 마샬러는 공용 언어 런타임 힙과 관리되지 않는 힙 간에 데이터를 마샬링합니다. 마샬링은 호출자와 호출 수신자가 동일한 데이터 인스턴스에 대해 작업할 수 없는 경우에 항상 발생합니다. interop 마샬러를 사용하면 호출자와 호출 수신자가 데이터의 자체 복사본을 가진 경우에도 둘 모두 동일한 데이터에 대해 작업하는 것처럼 보이도록 할 수 있습니다.
COM에는 COM 아파트나 서로 다른 COM 프로세스 간에 데이터를 마샬링하는 마샬러도 있습니다. 동일한 COM 아파트 내의 관리 코드와 비관리 코드 사이에서 호출할 때는 interop 마샬러만 관련됩니다. 서로 다른 COM 아파트 또는 서로 다른 프로세스의 관리 코드와 비관리 코드 사이에서 호출할 때는 interop 마샬러와 COM 마샬러가 모두 관련됩니다.
COM 클라이언트 및 .NET 서버
어셈블리 등록 도구(Regasm.exe)에서 등록한 형식 라이브러리와 함께 내보내진 관리되는 서버의 ThreadingModel 레지스트리 항목은 Both로 설정되어 있습니다. 이 값은 서버가 STA(단일 스레드 아파트) 또는 MTA(다중 스레드 아파트)에서 활성화될 수 있음을 나타냅니다. 서버 개체는 다음 표에서 보여 주는 것과 같이 호출자와 동일한 아파트에서 만들어집니다.
COM 클라이언트 |
.NET 서버 |
마샬링 요구 사항 |
---|---|---|
STA |
Both가 STA로 됩니다. |
동일한 아파트에서의 마샬링 |
MTA |
Both가 MTA로 됩니다. |
동일한 아파트에서의 마샬링 |
클라이언트와 서버가 동일한 아파트에 있기 때문에 interop 마샬링 서비스에서 모든 데이터 마샬링을 자동으로 처리합니다. 다음 그림에서는 동일한 COM 스타일 아파트 내의 관리되는 힙과 관리되지 않는 힙 사이에서 작동하는 interop 마샬링 서비스를 보여 줍니다.
동일한 아파트에서의 마샬링 프로세스
관리되는 서버를 내보내려는 경우 COM 클라이언트에서는 서버의 아파트를 확인합니다. MTA에서 초기화된 COM 클라이언트가 호출한 관리되는 서버는 스레드로부터 안전해야 합니다.
.NET 클라이언트 및 COM 서버
.NET 클라이언트 아파트의 기본 설정은 MTA이지만 .NET 클라이언트의 응용 프로그램 종류에 따라 이 기본 설정이 변경될 수 있습니다. 예를 들어, Visual Basic 2005 클라이언트 아파트의 설정은 STA입니다. STAThreadAttribute, MTAThreadAttribute, Thread.ApartmentState 속성 또는 Page.AspCompatMode 속성을 사용하면 관리되는 클라이언트의 아파트 설정을 확인하고 변경할 수 있습니다.
구성 요소 작성자는 COM 서버의 스레드 선호도를 설정합니다. 다음 표에서는 .NET 클라이언트와 COM 서버의 아파트 설정 조합을 보여 줍니다. 또한 각 조합에 따른 마샬링 요구 사항도 보여 줍니다.
.NET 클라이언트 |
COM 서버 |
마샬링 요구 사항 |
---|---|---|
MTA(기본값) |
MTA STA |
Interop 마샬링 Interop 및 COM 마샬링 |
STA |
MTA STA |
Interop 및 COM 마샬링 Interop 마샬링 |
관리되는 클라이언트와 관리되지 않는 서버가 동일한 아파트에 있기 때문에 interop 마샬링 서비스에서 모든 데이터 마샬링을 처리합니다. 그러나 클라이언트와 서버가 서로 다른 아파트에서 초기화된 경우에는 COM 마샬링도 필요합니다. 다음 그림에서는 아파트 간 호출의 요소를 보여 줍니다.
.NET 클라이언트와 COM 개체 사이의 아파트 간 호출
아파트 간 마샬링의 경우에는 다음 작업을 수행할 수 있습니다.
경계를 넘는 호출이 많이 발생할 때만 눈에 띄는 아파트 간 마샬링의 오버헤드를 허용할 수 있습니다. 아파트 경계를 넘는 호출이 성공적으로 수행되도록 하려면 COM 구성 요소의 형식 라이브러리를 등록해야 합니다.
클라이언트 스레드를 STA 또는 MTA로 설정하여 주 스레드를 변경할 수 있습니다. 예를 들어, C# 클라이언트에서 많은 STA COM 구성 요소를 호출하는 경우에는 주 스레드를 STA로 설정함으로써 아파트 간 마샬링을 방지할 수 있습니다.
참고: C# 클라이언트의 스레드가 STA로 설정된 경우 MTA COM 구성 요소를 호출하려면 아파트 간 마샬링이 필요합니다.
아파트 모델을 명시적으로 선택하는 방법에 대한 자세한 내용은 관리되는 스레딩과 관리되지 않는 스레딩을 참조하십시오.
원격 호출 마샬링
아파트 간 마샬링과 마찬가지로, 개체가 별도의 프로세스에 상주하는 경우 관리 코드와 비관리 코드 사이에서 발생하는 각 호출에는 항상 COM 마샬링이 관련됩니다. 예를 들면 다음과 같습니다.
원격 호스트에서 관리되는 서버를 호출하는 COM 클라이언트는 DCOM을 사용합니다.
원격 호스트에서 COM 서버를 호출하는 관리되는 클라이언트는 DCOM을 사용합니다.
다음 그림에서는 interop 마샬링과 COM 마샬링에서 프로세스 및 호스트 경계 간의 통신 채널을 제공하는 방법을 보여 줍니다.
프로세스 간 마샬링
ID 보존
공용 언어 런타임에서는 관리되는 참조와 관리되지 않는 참조의 ID를 보존합니다. 다음 그림에서는 프로세스 및 호스트 경계를 넘는 관리되지 않는 직접 참조(위쪽 행)와 관리되는 직접 참조(아래쪽 행)의 흐름을 보여 줍니다.
프로세스 및 호스트 경계를 넘어 전달되는 참조
다음은 이 그림에 대한 설명입니다.
관리되지 않는 클라이언트는 원격 호스트로부터 COM 개체에 대한 참조를 가져온 관리되는 개체로부터 해당 참조를 가져옵니다. 원격 메커니즘은 DCOM입니다.
관리되는 클라이언트는 원격 호스트로부터 관리되는 개체에 대한 참조를 가져온 COM 개체로부터 해당 참조를 가져옵니다. 원격 메커니즘은 DCOM입니다.
참고: 관리되는 서버의 내보내진 형식 라이브러리는 등록되어 있어야 합니다.
호출자와 호출 수신자 사이의 프로세스 경계 수는 상관이 없으며, in-process와 out-of-process 호출에 대해 동일한 직접 참조가 발생합니다.
관리되는 원격 서비스
런타임에서는 프로세스 및 호스트 경계를 넘는 여러 관리되는 개체 사이의 통신 채널을 구성하는 데 사용할 수 있는 관리되는 원격 서비스도 제공합니다. 관리되는 원격 서비스를 사용하면 다음 그림에서 보여 주는 것처럼 통신하는 구성 요소 사이의 방화벽을 수용할 수 있습니다.
SOAP 또는 TcpChannel 클래스를 사용하여 방화벽을 넘는 호출 원격화
서비스 구성 요소와 COM 간의 호출 같이 관리되지 않는 일부 호출은 SOAP를 채널로 사용할 수 있습니다. 관리되는 원격 서비스에 대한 자세한 내용은 .NET Framework Remoting 개요를 참조하십시오.