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.