다음을 통해 공유


마샬링 개요

업데이트: 2007년 11월

.NET Compact Framework 버전 2.0은 IDispatch와 플랫폼 호출 및 vtable 호출을 통해 확장된 마샬링 지원을 제공합니다. 그러한 지원으로는 다음과 같은 것들이 있습니다.

  • MarshalAsAttribute 특성을 사용합니다.

  • Windows Embedded CE에서 지원되는 variant 형식을 마샬링합니다.

  • vtable을 통해 COM 인터페이스를 호출하는 형식을 마샬링합니다.

  • 포함된 배열 및 문자열을 사용하여 구조를 마샬링합니다.

  • 구조에 대한 레이아웃을 지정합니다.

값이나 참조를 기준으로 다음과 같은 형식을 마샬링할 수 있습니다.

  • BStr

  • IUnknown

  • IDispatch

  • SafeArray

  • DateTime(OLE DATE로 마샬링됨)

  • Variant

.NET Compact Framework 2.0은 AllocHGlobalFreeHGlobal 메서드를 지원합니다.

Interop 로깅

함수 시그니처의 로그 파일을 만들어서 Interop 호출이 마샬링되는 방법을 볼 수 있습니다. 이 파일을 만드는 방법에 대한 자세한 내용은 방법: 로그 파일 만들기를 참조하십시오. 로그 파일을 해석하는 방법에 대한 자세한 내용은 로그 파일 정보를 참조하십시오.

전체 .NET Framework와의 마샬링 차이점

.NET Compact Framework는 전체 .NET Framework에서 제공되는 다음과 같은 마샬링 및 상호 운용성 기능을 지원하지 않습니다.

  • 사용자 지정 마샬링

  • GetDelegateForFunctionPointer 메서드를 사용하여 네이티브 함수 포인터에서 관리되는 대리자 가져오기. 그러나 관리되는 대리자에서 네이티브 함수 포인터를 만들 수 있습니다.

  • 네이티브 구성 요소에서 .NET Compact Framework 클래스에 액세스

  • IDispatch를 통한 구조체(VT_RECORD) 전달

  • IDispatch를 통한 Int64 및 UInt64 형식 전달

.NET Compact Framework의 다음과 같은 마샬링 동작은 전체 .NET Framework와 다릅니다.

  • .NET Compact Framework에서는 SCODE 값 배열을 마샬링할 수 있지만 전체 .NET Framework에서는 이렇게 할 수 없습니다.

  • .NET Compact Framework는 전체 .NET Framework와는 달리 IUnknown 및 IDispatch 포인터의 배열을 마샬링합니다.

  • .NET Compact Framework는 모든 스레드를 다중 스레드 아파트로 초기화하며, 다른 스레딩 모델이나 아파트 모델 설정은 지원하지 않습니다. 결과적으로 .NET Compact Framework는 ApartmentState 속성이나 다음 메서드를 지원하지 않습니다.

Visual Basic Declare 문을 사용한 마샬링

Visual Basic Declare 문은 외부 프로시저에 대한 참조를 DLL 안에 declare할 수 있는 또 하나의 방법입니다. Declare 문의 Ansi 키워드는 지원되지 않습니다.

Declare 문을 사용한 마샬링과 DllImportAttribute 클래스를 사용한 마샬링은 ByVal String 개체를 제외하고는 동일하며 Declare 문에서는 ByVal String 매개 변수가 출력 매개 변수로 마샬링됩니다. 문자열은 변경되지 않으므로 공용 언어 런타임에서는 강제로 문자열을 복사하고 새 참조를 반환합니다.

IDispatch와 플랫폼 호출 마샬러의 차이점

다음 표에서는 두 개의 마샬러에 의해 서로 다르게 마샬링되는 형식을 나열합니다.

형식

IDispatch

플랫폼 호출 및 vtable

String

BStr

wchar *

Object

Variant

NULL

Boolean

VARIANT_BOOL

byte

Array

SafeArray

C 스타일 배열

.NET Compact Framework는 StructLayoutAttribute를 사용하지 않고 플랫폼 호출을 통해 클래스를 자동 레이아웃 구조로 마샬링하며, 전체 .NET Framework는 클래스를 CCW(COM 호출 가능 래퍼)로 마샬링합니다.

.NET Compact Framework는 FADF_FIXEDSIZE를 사용하여 SafeArray를 표시하고 네이티브 코드에서 이 배열의 크기를 변경할 경우 예외를 throw합니다.

Boolean이 네이티브 바이트 형식으로 변환되는 경우에는 Boolean을 반환 형식이 아닌 인수로만 마샬링할 수 있습니다.

대리자 마샬링

기본적으로 대리자는 함수 포인터로 마샬링됩니다. 또한 UnmanagedType 열거형의 FunctionPtr 값을 명시적으로 사용하여 MarshalAsAttribute의 인스턴스를 만들 수 있습니다. 예제를 보려면 대리자를 함수 포인터로 마샬링을 참조하십시오.

문자 집합 지정

플랫폼 호출을 통해 문자열을 마샬링할 경우 DllImportAttributeCharSet 필드를 사용하여 문자 집합을 지정할 수 있습니다.

.NET Compact Framework에서는 다음의 두 값을 지원합니다.

  • Auto. 문자열은 운영 체제에 대한 적절한 문자 집합(유니코드 문자 집합)을 사용하여 마살량됩니다. 이 값은 기본값입니다.

  • Unicode. 문자열은 유니코드 문자 집합을 통해 마샬링됩니다.

Ansi 값은 Windows Embedded CE가 유니코드 전용이기 때문에 지원되지 않습니다. NoneAnsi와 동일하지만 지원되지 않습니다.

.NET Compact Framework는 ExactSpelling 필드를 지원하지 않으므로 공용 언어 런타임은 CharSet에 지정된 값에 따라 진입점을 자동 검색합니다.

개체 고정

.NET Compact Framework 공용 언어 런타임에서 개체를 마샬링하면 가비지 수집기가 해당 개체를 해제하거나 이동하지 못하도록 P/Invoke 호출이 수행되는 기간 동안 개체가 고정됩니다.

메모리 사용

다음 지침에 따라 .NET Compact Framework에서 비관리 코드에 대해 메모리를 처리할 수 있습니다.

  • 항상 관리 코드에서 메모리를 할당한 다음 비관리 코드로 전달합니다.

  • 비관리 코드에 관리되는 구성 요소에 대한 포인터가 있으면 GCHandle 구조체를 사용하여 해당 개체를 수동으로 고정시켜야 합니다.

.NET Compact Framework 공용 언어 런타임은 시작할 때 스레드에 대해 CoInitialize를 호출하고 종료할 때 스레드에 대해 CoUninitialize를 호출합니다. 스레드는 "자유 스레딩"으로 표시됩니다.

참고 항목

작업

방법: 로그 파일 만들기

개념

로그 파일 정보

기타 리소스

.NET Compact Framework의 상호 운용성