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 |
---|---|
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. |
|
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. |
|
Permite que o empacotador limpar os dados nativos retornado pelo MarshalManagedToNative método. |
|
Permite que o empacotador para limpar os dados gerenciados que são retornados pelo MarshalNativeToManaged método. |
|
Retorna o tamanho dos dados não gerenciados para ser empacotado. |