다음을 통해 공유


매개 변수 마샬링 사용자 지정

.NET 런타임의 기본 매개 변수 마샬링 동작이 원하는 대로 작동하지 않을 경우, System.Runtime.InteropServices.MarshalAsAttribute 특성을 사용하여 매개 변수가 마샬링되는 방식을 사용자 지정할 수 있습니다. 이러한 사용자 지정 기능은 런타임 마샬링이 사용하지 않도록 설정된 경우 적용되지 않습니다.

참고 항목

P/InvokesCOM에 대한 원본 생성 interop은 매개 변수에서 MarshalAsAttribute의 작은 하위 집합만 존중합니다. 대신 원본 생성 interop에는 MarshalUsingAttribute를 사용하는 것이 좋습니다. 자세한 내용은 원본 생성을 위한 사용자 지정 마샬링을 참조하세요.

문자열 매개 변수 사용자 지정

.NET에는 문자열을 마샬링하기 위한 다양한 형식이 있습니다. 이러한 메서드는 C 스타일 문자열 및 Windows 중심 문자열 형식에 대한 개별 섹션으로 나누어져 있습니다.

C 스타일 문자열

이러한 형식은 각각 Null 종료 문자열을 네이티브 코드에 전달하며, 네이티브 문자열의 인코딩에 따라 다릅니다.

System.Runtime.InteropServices.UnmanagedType 인코딩
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

UnmanagedType.VBByRefStr 형식은 약간 다릅니다. LPWStr과 마찬가지로, 이 형식은 문자열을 UTF-16으로 인코드된 네이티브 C 스타일 문자열로 마샬링합니다. 그러나 관리형 시그니처는 문자열을 참조로 전달하게 하고, 일치하는 네이티브 시그니처는 문자열을 값으로 사용합니다. 이러한 차이를 통해 StringBuilder를 사용하지 않고도 문자열을 값으로 사용하고 현재 위치에서 수정하는 네이티브 API를 사용할 수 있습니다. 네이티브 시그니처와 관리형 시그니처의 불일치와 혼동되는 경향이 있으므로 이 형식을 수동으로 사용하지 않는 것이 좋습니다.

Windows 중심 문자열 형식

COM 또는 OLE 인터페이스를 조작하는 경우 네이티브 함수가 문자열을 BSTR 인수로 사용하는 것을 보게 될 가능성이 큽니다. UnmanagedType.BStr 비관리형 형식을 사용하여 문자열을 BSTR로 마샬링할 수 있습니다.

WinRT API를 조작하는 경우 UnmanagedType.HString 형식을 사용하여 문자열을 HSTRING로 마샬링할 수 있습니다.

배열 매개 변수 사용자 지정

.NET에서는 배열 매개 변수를 마샬링하는 몇 가지 방법도 제공합니다. C 스타일 배열을 사용하는 API를 호출하는 경우 UnmanagedType.LPArray 비관리형 형식을 사용합니다. 배열의 값에 사용자 지정 마샬링이 필요한 경우 해당 배열의 [MarshalAs] 특성에 있는 ArraySubType 필드를 사용할 수 있습니다.

COM API를 사용하는 경우 배열 매개 변수를 SAFEARRAY*로 마샬링해야 할 가능성이 큽니다. 이렇게 하려면 UnmanagedType.SafeArray 비관리형 형식을 사용할 수 있습니다. SAFEARRAY 요소의 기본 형식은 object 필드 사용자 지정에 대한 표에서 확인할 수 있습니다. MarshalAsAttribute.SafeArraySubTypeMarshalAsAttribute.SafeArrayUserDefinedSubType 필드를 사용하여 SAFEARRAY의 정확한 요소 형식을 사용자 지정할 수 있습니다.

부울 또는 10진 매개 변수 사용자 지정

부울 또는 10진 매개 변수 마샬링에 대한 자세한 내용은 구조체 마샬링 사용자 지정을 참조하세요.

개체 매개 변수 사용자 지정(Windows에만 해당)

Windows에서 .NET 런타임은 개체 매개 변수를 네이티브 코드로 마샬링하는 몇 가지 방법을 제공합니다.

특정 COM 인터페이스로 마샬링

API에서 COM 개체에 대한 포인터를 사용하는 경우 object 형식 매개 변수에 다음과 같은 UnmanagedType 형식 중 하나를 사용하여 이러한 특정 인터페이스로 마샬링하도록 .NET에 지정할 수 있습니다.

  • IUnknown
  • IDispatch
  • IInspectable

또한 형식이 [ComVisible(true)]로 표시되거나 object 형식을 마샬링하는 경우 UnmanagedType.Interface 형식을 사용하여 해당 형식의 COM 보기에 대한 COM 호출 가능 래퍼로 개체를 마샬링할 수 있습니다.

VARIANT로 마샬링

네이티브 API에서 Win32 VARIANT를 사용하는 경우 object 매개 변수의 UnmanagedType.Struct 형식을 사용하여 개체를 VARIANT로 마샬링할 수 있습니다. .NET 형식과 VARIANT 형식 간의 매핑에 대해서는 object 필드 사용자 지정 문서를 참조하세요.

사용자 지정 마샬러

네이티브 COM 인터페이스를 다른 관리형 형식으로 프로젝트하려는 경우 UnmanagedType.CustomMarshaler 형식과 ICustomMarshaler 구현을 사용하여 사용자 고유의 사용자 지정 마샬링 코드를 제공할 수 있습니다.