Condividi tramite


Utilizzo di un gestore di marshalling sostitutivo

Quando il gestore di marshalling è completo, potrà essere utilizzato come wrapper personalizzato per un determinato tipo. Nell'esempio che segue viene illustrata la definizione di interfaccia gestita IUserData:

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

Nell'esempio che segue l'interfaccia IUserData utilizza NewOldMarshaler per consentire ai client di passare un'interfaccia IOld al metodo DoSomeStuff. La descrizione gestita del metodo DoSomeStuff accetta un'interfaccia INew, come illustrato nel precedente esempio, mentre la versione non gestita di DoSomeStuff accetta un puntatore a interfaccia IOld, come illustrato nell'esempio che segue.

Rappresentazione di libreria dei tipi

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

La libreria dei tipi generata esportando la definizione gestita di IUserData conterrà la definizione non gestita illustrata in questo esempio, anziché la definizione standard. L'attributo MarshalAsAttribute applicato all'argomento INew nella definizione gestita del metodo DoSomeStuff indica che l'argomento utilizza un gestore di marshalling personalizzato, come illustrato nel seguente esempio:

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 è utilizzato per specificare un gestore di marshalling personalizzato, MarshalAsAttribute accetta i due parametri denominati riportati di seguito:

  • MarshalType (Obbligatorio)

    Il nome, con qualificazione di assembly, del gestore di marshalling personalizzato. Il nome deve includere lo spazio dei nomi e la classe del gestore di marshalling personalizzato. Se il gestore di marshalling personalizzato è definito in un assembly diverso da quello in cui viene utilizzato, è necessario specificare il nome dell'assembly in cui è definito.

    Nota

    È possibile utilizzare il campo MarshalTypeRef invece del campo MarshalType. MarshalTypeRef accetta un tipo più facilmente specificabile.

  • MarshalCookie (Facoltativo)

    Un cookie passato al gestore di marshalling personalizzato. È possibile utilizzare il cookie per fornire ulteriori informazioni al gestore di marshalling personalizzato. Lo stesso gestore di marshalling può essere ad esempio utilizzato per fornire più wrapper, di cui il cookie identifica quello specifico. Il cookie viene passato al metodo GetInstance del gestore di marshalling.

Vedere anche

Concetti

Definizione del tipo di marshalling
Implementazione dell'interfaccia ICustomMarshaler

Altre risorse

Marshalling personalizzato