Interop 마샬링에서는 메서드 인수에서 데이터를 전달하고 호출 중에 관리되는 메모리와 관리되지 않는 메모리 간에 값을 반환하는 방법을 제어합니다. Interop 마샬링은 공용 언어 런타임의 마샬링 서비스에서 수행하는 런타임 작업입니다.
대부분의 데이터 형식은 관리되는 메모리와 관리되지 않는 메모리 모두에서 공통적인 표현을 사용합니다. interop 마샬러가 이러한 유형을 처리합니다. 다른 형식은 모호하거나 관리되는 메모리에 전혀 표시되지 않을 수 있습니다.
모호한 형식에는 관리되는 단일 형식에 매핑되는 관리되지 않는 표현이 여러 개 있거나 배열 크기와 같은 형식 정보가 누락되었을 수 있습니다. 모호한 형식의 경우 마샬러는 여러 표현이 있는 기본 표현과 대체 표현을 제공합니다. 모호한 형식을 마샬링하는 방법에 대한 명시적 지침을 마샬러에 제공할 수 있습니다.
플랫폼 호출 및 COM Interop 모델
공용 언어 런타임은 관리되지 않는 코드와 상호 운용하기 위한 두 가지 메커니즘을 제공합니다.
- 관리 코드가 관리되지 않는 라이브러리에서 내보낸 함수를 호출할 수 있도록 하는 플랫폼 호출입니다.
- COM interop- 관리 코드가 인터페이스를 통해 COM(구성 요소 개체 모델) 개체와 상호 작용할 수 있도록 합니다.
플랫폼 호출과 COM 상호 운영 모두 상호 운영 마샬링을 사용하여, 필요한 경우 호출자와 호출 수신자 간에 메서드 인수를 정확하게 이동합니다. 다음 그림에서 알 수 있듯이 플랫폼 호출 메서드 호출은 관리 코드에서 관리되지 않는 코드로 흐르며 콜백 함수 가 관련된 경우를 제외하고는 다른 방법으로는 전달되지 않습니다. 플랫폼 호출은 관리 코드에서 비관리 코드로만 흐를 수 있지만 데이터는 입력 또는 출력 매개 변수로 양방향으로 흐를 수 있습니다. COM interop 메서드 호출은 어느 방향으로든 흐를 수 있습니다.
가장 낮은 수준에서 두 메커니즘 모두 동일한 interop 마샬링 서비스를 사용합니다. 그러나 특정 데이터 형식은 COM interop 또는 플랫폼 호출에서만 지원됩니다. 자세한 내용은 기본 마샬링 동작을 참조하세요.
마샬링 및 COM 아파트먼트
interop 마샬러는 공용 언어 런타임 힙과 관리되지 않는 힙 간에 데이터를 마샬링합니다. 마샬링은 호출자와 호출자가 동일한 데이터 인스턴스에서 작동할 수 없을 때마다 발생합니다. interop 마샬러를 사용하면, 호출자와 피호출자는 자신만의 데이터 복사본을 가지고 있더라도 동일한 데이터에서 운영하는 것처럼 보일 수 있습니다.
COM에는 COM 아파트 또는 다른 COM 프로세스 간에 데이터를 마샬링하는 마샬러도 있습니다. 동일한 COM 아파트 내에서 관리 코드와 관리되지 않는 코드 간에 호출할 때 interop 마샬러는 유일한 마샬러입니다. 다른 COM 아파트 또는 다른 프로세스에서 관리 코드와 관리되지 않는 코드 간에 호출하는 경우 interop 마샬러와 COM 마샬러가 모두 관련됩니다.
COM 클라이언트 및 관리되는 서버
Regasm.exe(어셈블리 등록 도구)에 의해 등록된 형식 라이브러리가 있는 내보낸 관리 서버에 레지스트리 항목이 ThreadingModel
설정되어 있습니다Both
. 이 값은 STA(단일 스레드 아파트) 또는 MTA(다중 스레드 아파트)에서 서버를 활성화할 수 있음을 나타냅니다. 서버 개체는 다음 표와 같이 호출자와 동일한 아파트에 만들어집니다.
COM 클라이언트 | .NET 서버 | 마샬링 요구 사항 |
---|---|---|
STA |
Both 는 STA가 됩니다. |
같은 아파트 정리. |
MTA (메일 전송 에이전트) |
Both 는 MTA가 됩니다. |
같은 아파트 정리. |
클라이언트와 서버가 동일한 아파트에 있으므로 interop 마샬링 서비스는 모든 데이터 마샬링을 자동으로 처리합니다. 다음 그림에서는 동일한 COM 스타일의 아파트 내에서 관리되는 힙과 관리되지 않는 힙 간에 작동하는 interop 마샬링 서비스를 보여 줍니다.
관리되는 서버를 내보내려는 경우 COM 클라이언트가 서버의 아파트를 결정한다는 점에 유의하세요. MTA에서 초기화된 COM 클라이언트에서 호출하는 관리되는 서버는 스레드 안전을 보장해야 합니다.
관리되는 클라이언트 및 COM 서버
관리되는 클라이언트 아파트의 기본 설정은 MTA입니다. 그러나 .NET 클라이언트의 애플리케이션 유형은 기본 설정을 변경할 수 있습니다. 예를 들어 Visual Basic 클라이언트 아파트 설정은 STA입니다. System.STAThreadAttribute, System.MTAThreadAttribute, Thread.ApartmentState 속성 또는 Page.AspCompatMode 속성을 사용하여 관리되는 클라이언트의 아파트 설정을 검사하고 변경할 수 있습니다.
구성 요소의 작성자가 COM 서버의 스레드 선호도를 설정합니다. 다음 표에서는 .NET 클라이언트 및 COM 서버에 대한 아파트 설정의 조합을 보여 줍니다. 또한 조합에 대한 결과 마샬링 요구 사항을 보여 줍니다.
.NET 클라이언트 | COM 서버 | 마샬링 요구 사항 |
---|---|---|
MTA(기본값) | 메일 전송 에이전트 (MTA) STA |
Interop 마샬링. 인터롭 및 COM 마샬링 |
STA | MTA STA |
인터롭 및 COM 마샬링 Interop 마샬링. |
관리되는 클라이언트와 관리되지 않는 서버가 동일한 아파트에 있는 경우 interop 마샬링 서비스는 모든 데이터 마샬링을 처리합니다. 그러나 클라이언트와 서버가 다른 아파트에서 초기화되면 COM 마샬링도 필요합니다. 다음 그림에서는 아파트 간 전화통화의 요소를 보여 줍니다.
아파트 간 마샬링의 경우 다음을 수행할 수 있습니다.
아파트 간 경계를 넘는 많은 호출이 있을 때만 눈에 띄게 되는 마셜링의 추가 비용을 받아들입니다. 아파트 경계를 성공적으로 넘어가려면 COM 구성 요소의 형식 라이브러리를 등록해야 합니다.
클라이언트 스레드를 STA 또는 MTA로 설정하여 주 스레드를 변경합니다. 예를 들어 C# 클라이언트가 많은 STA COM 구성 요소를 호출하는 경우 주 스레드를 STA로 설정하여 아파트 간 마샬링을 방지할 수 있습니다.
비고
C# 클라이언트의 스레드가 STA로 설정되면 MTA COM 구성 요소에 대한 호출에는 아파트 간 마샬링이 필요합니다.
아파트 모델을 명시적으로 선택하는 방법에 대한 지침은 관리형 및 관리되지 않는 스레딩을 참조하세요.
원격 호출 마샬링
아파트 간 마샬링과 마찬가지로, 개체가 별도의 프로세스에 상주할 때마다 COM 마샬링이 관리 코드와 관리되지 않는 코드 간의 각 호출에 포함됩니다. 다음은 그 예입니다.
- 원격 호스트에서 관리되는 서버를 호출하는 COM 클라이언트는 DCOM(분산 COM)을 사용합니다.
- 원격 호스트에서 COM 서버를 호출하는 관리되는 클라이언트는 DCOM을 사용합니다.
다음 그림에서는 interop 마샬링 및 COM 마샬링이 프로세스 및 호스트 경계를 넘어 통신 채널을 제공하는 방법을 보여 줍니다.
ID 유지
공용 언어 런타임은 관리되는 참조 및 관리되지 않는 참조의 ID를 유지합니다. 다음 그림에서는 프로세스 및 호스트 경계를 넘어 직접 관리되지 않는 참조(맨 위 행) 및 직접 관리되는 참조(맨 아래 행)의 흐름을 보여 줍니다.
이 그림의 내용:
관리되지 않는 클라이언트는 원격 호스트에서 참조를 가져오는 관리되는 개체를 통해 COM 개체에 대한 참조를 얻습니다. 원격 메커니즘은 DCOM입니다.
관리되는 클라이언트는 원격 호스트에서 이 참조를 가져오는 COM 개체에서 관리되는 개체에 대한 참조를 가져옵니다. 원격 메커니즘은 DCOM입니다.
비고
관리되는 서버의 내보낸 형식 라이브러리를 등록해야 합니다.
호출자와 피호출자 사이의 프로세스 경계 수는 중요하지 않습니다. 프로세스 내부 호출과 외부 호출 모두 동일한 직접 참조가 발생합니다.
관리되는 원격
또한 런타임은 프로세스와 호스트 경계를 넘어 관리되는 개체 간에 통신 채널을 설정하는 데 사용할 수 있는 관리되는 원격 기능을 제공합니다. 다음 그림과 같이 관리되는 원격은 통신 구성 요소 간의 방화벽을 수용할 수 있습니다.
SOAP 또는 TcpChannel 클래스를 사용하여 방화벽 간 원격 호출
서비스 구성 요소와 COM 간의 호출과 같은 일부 관리되지 않는 호출은 SOAP를 통해 채널화될 수 있습니다.
관련 항목
제목 | 설명 |
---|---|
기본 마샬링 동작 | interop 마샬링 서비스에서 데이터를 마샬링하는 데 사용하는 규칙을 설명합니다. |
플랫폼 호출을 사용하여 데이터 마샬링 | 메서드 매개 변수를 선언하고 관리되지 않는 라이브러리에서 내보낸 함수에 인수를 전달하는 방법을 설명합니다. |
COM Interop을 사용하여 데이터 마샬링 | 마샬링 동작을 변경하도록 COM 래퍼를 사용자 지정하는 방법을 설명합니다. |
방법: Managed-Code DCOM을 WCF로 마이그레이션 | DCOM에서 WCF로 마이그레이션하는 방법을 설명합니다. |
방법: HRESULT 및 예외 매핑 | 사용자 지정 예외를 HRESULT에 매핑하는 방법을 설명하고 각 HRESULT에서 .NET Framework의 비교 가능한 예외 클래스로의 전체 매핑을 제공합니다. |
제네릭 형식을 사용하여 상호 운용 | COM 상호 운용성을 위해 제네릭 형식을 사용할 때 지원되는 작업에 대해 설명합니다. |
비관리 코드와의 상호 운용 | 공용 언어 런타임에서 제공하는 상호 운용성 서비스에 대해 설명합니다. |
고급 COM 상호 운용성 | COM 구성 요소를 .NET Framework 애플리케이션에 통합하는 방법에 대한 자세한 정보 링크를 제공합니다. |
상호 운용에 대한 디자인 고려 사항 | 통합 COM 구성 요소를 작성하기 위한 팁을 제공합니다. |
참고 문헌
.NET