Partilhar via


Implementando a Interface ICustomMarshaler

Para usar um empacotador personalizado, você deve aplicar o MarshalAsAttribute de atributo para o parâmetro ou campo que está sendo empacotado. Este atributo identifica o empacotador personalizado que ativa o wrapper apropriado.

O código a seguir C# Exibe a interface base que deve ser implementada por todos os empacotadores personalizados:

namespace System.Runtime.InteropServices
{
    using System;

[System.Runtime.InteropServices.ComVisible(true)]
    public interface ICustomMarshaler
    {
     Object MarshalNativeToManaged( IntPtr pNativeData );
     IntPtr MarshalManagedToNative( Object ManagedObj );
     void CleanUpNativeData( IntPtr pNativeData );
     void CleanUpManagedData( Object ManagedObj );
     int GetNativeDataSize();
    }
}

O empacotador personalizado deve implementar a ICustomMarshaler interface para fornecer os wrappers apropriados para o tempo de execução.

Além disso, você deve implementar o seguinte método estático, você pode chamar para recuperar uma instância do empacotador personalizado:

static ICustomMarshaler *GetInstance(String *pstrCookie);

O runtime cria o empacotador personalizado na primeira vez que um argumento deve ser empacotado. O tempo de execução, em seguida, chama o ICustomMarshaler.MarshalNativeToManaged e ICustomMarshaler.MarshalManagedToNative métodos de empacotador personalizado para ativar o wrapper correto para manipular a chamada. A tabela a seguir descreve os métodos expostos pelo ICustomMarshaler interface.

Método

Descrição

MarshalNativeToManaged

Empacota um ponteiro para dados nativos para um objeto gerenciado. Esse método retorna um personalizado runtime callable wrapper (RCW) que é possível empacotar a interface não gerenciada que é passada como um argumento. O empacotador deve retornar uma instância do RCW personalizado para esse tipo.

MarshalManagedToNative

Empacota um objeto gerenciado em um ponteiro para dados nativos. Esse método retorna um personalizado COM callable wrapper (CCW) que é possível empacotar a interface gerenciada, é passada como um argumento. O empacotador deve retornar uma instância da CCW personalizado para esse tipo.

CleanUpNativeData

Permite que o empacotador limpar os dados nativos retornado pelo MarshalManagedToNative método.

CleanUpManagedData

Permite que o empacotador para limpar os dados gerenciados que são retornados pelo MarshalNativeToManaged método.

GetNativeDataSize

Retorna o tamanho dos dados não gerenciados para ser empacotado.

Consulte também

Conceitos

Empacotamento personalizado

A definição do tipo de empacotamento

Usando um empacotador substituto