Partilhar via


Usando um empacotador substituto

Uma vez concluído o empacotador, pode ser usado como um wrapper personalizado para um determinado tipo. O exemplo a seguir mostra a definição de interface gerenciada IUserData:

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

No exemplo a seguir, o IUserData interface usa o NewOldMarshaler para permitir que os clientes não gerenciados passar um IOld interface para o DoSomeStuff método. A descrição gerenciada a DoSomeStuff leva um INew interface, conforme mostrado no exemplo anterior, enquanto a versão não gerenciada da DoSomeStuff leva um IOld ponteiro de interface, conforme mostrado no exemplo a seguir.

Representação de biblioteca de tipo

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

A biblioteca de tipos gerada por exportar a definição gerenciada de IUserData produz a definição de não gerenciada mostrada neste exemplo em vez de definição padrão. O MarshalAsAttribute atributo aplicado para a INew argumento na definição gerenciada a DoSomeStuff método indica que o argumento usa um empacotador personalizado, como mostra o exemplo a seguir:

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
    );
}

Quando usado para especificar um empacotador personalizado, o MarshalAsAttribute leva os dois parâmetros nomeados:

  • MarshalType(Obrigatório)

    O nome qualificado do assembly do empacotador personalizado. O nome deve incluir o espaço para nome e a classe de empacotador personalizado. Se o empacotador personalizado é definido em um assembly diferente daquele que ele é usado no, você deve especificar o nome do assembly no qual está definida.

    Observação

    Você pode usar o MarshalTypeRef campo em vez da configuração de MarshalType campo.MarshalTypeRef leva um tipo que é mais fácil especificar.

  • MarshalCookie(Opcional)

    Um cookie é passado para o empacotador personalizado. Você pode usar o cookie para fornecer informações adicionais para o empacotador. Por exemplo, o empacotador mesmo poderia ser usado para fornecer um número de invólucros, para o qual o cookie identifica o wrapper específico. O cookie é passado para o GetInstance o método de empacotamento.

Consulte também

Conceitos

Empacotamento personalizado

A definição do tipo de empacotamento

Implementando a Interface ICustomMarshaler