다음을 통해 공유


대체 마샬러 사용

마샬러가 완료되면 이를 특정 형식에 대한 사용자 지정 래퍼로 사용할 수 있습니다. 다음 예제에서는 관리되는 인터페이스 정의 IUserData를 보여 줍니다.

Public Interface IUserData
    Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
    void DoSomeStuff(INew pINew);
}

다음 예제에서 IUserData 인터페이스는 NewOldMarshaler를 사용하여 관리되지 않는 클라이언트가 DoSomeStuff 메서드에 IOld 인터페이스를 전달할 수 있도록 합니다. DoSomeStuff 메서드의 관리되는 설명은 위의 예제와 같이 INew 인터페이스를 사용하는 반면 DoSomeStuff의 관리되지 않는 버전은 다음 예제와 같이 IOld 인터페이스 포인터를 사용합니다.

형식 라이브러리 표현

[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
     [uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
     interface IUserData : IUnknown
         HRESULT DoSomeStuff(IUnknown* pIOld);
}

IUserData의 관리되는 정의를 내보낸 결과로 생성된 형식 라이브러리는 표준 정의 대신 이 예제에 나타난 관리되지 않는 정의를 만듭니다. 다음 예제와 같이 DoSomeStuff 메서드의 관리되는 정의에서 INew 인수에 적용된 MarshalAsAttribute 특성은 인수가 사용자 지정 마샬러를 사용함을 나타냅니다.

Imports System.Runtime.InteropServices

Public Interface IUserData
    Public Sub DoSomeStuff( _
        <MarshalAs(UnmanagedType.CustomMarshaler, _
        MarshalType := "MyCompany.NewOldMarshaler")> pINew As INew)
    End Sub
End Interface
using System.runtime.InteropServices;

public interface IUserData {
    void DoSomeStuff(
        [MarshalAs(UnmanagedType.CustomMarshaler,
             MarshalType="MyCompany.NewOldMarshaler")]
        INew pINew
    );
}

사용자 지정 마샬러를 지정하는 경우 MarshalAsAttribute는 다음과 같은 두 가지 명명된 매개 변수를 사용합니다.

  • MarshalType(필수)

    사용자 지정 마샬러의 어셈블리로 한정된 이름입니다. 이 이름은 사용자 지정 마샬러의 클래스와 네임스페이스를 포함해야 합니다. 사용자 지정 마샬러가 사용된 어셈블리가 아닌 다른 어셈블리에서 정의된 경우 정의된 어셈블리 내에서 어셈블리 이름을 지정해야 합니다.

    참고참고

    MarshalType 필드 대신 MarshalTypeRef 필드를 사용할 수 있습니다.MarshalTypeRef의 형식이 더 지정하기 쉽습니다.

  • MarshalCookie(옵션)

    사용자 지정 마샬러에 전달된 쿠키입니다. 이 쿠키를 사용하여 마샬러에 추가 정보를 제공할 수 있습니다. 예를 들어, 동일한 마샬러를 사용하여 여러 래퍼를 제공할 수 있습니다. 이때 쿠키는 특정 래퍼를 식별합니다. 쿠키는 마샬러의 GetInstance 메서드에 전달됩니다.

참고 항목

개념

사용자 지정 마샬링

마샬링 형식 정의

ICustomMarshaler 인터페이스 구현