Personalizzare il marshalling dei parametri
Quando il comportamento di marshalling dei parametri predefinito del runtime .NET non esegue le operazioni desiderate, è possibile usare l'attributo System.Runtime.InteropServices.MarshalAsAttribute per personalizzare il modo in cui viene effettuato il marshalling dei parametri. Queste funzionalità di personalizzazione non si applicano quando il marshalling di runtime è disabilitato.
Nota
L'interoperabilità generata da codice sorgente per P/Invoke e COM rispetta solo un piccolo subset di MarshalAsAttribute sui parametri. È consigliabile invece usare MarshalUsingAttribute per l'interoperabilità generata da codice sorgente. Per altre informazioni, vedere Marshalling personalizzato per la generazione di codice sorgente.
Personalizzazione dei parametri stringa
.NET offre un'ampia gamma di formati per il marshalling delle stringhe. Questi metodi sono suddivisi in sezioni distinte per le stringhe in stile C e per i formati di stringa per Windows.
Stringhe in stile C
Ognuno di questi formati passa una stringa con terminazione Null al codice nativo. Si differenziano per la codifica della stringa nativa.
Valore System.Runtime.InteropServices.UnmanagedType |
Codifica |
---|---|
LPStr | ANSI |
LPUTF8Str | UTF-8 |
LPWStr | UTF-16 |
LPTStr | UTF-16 |
Il formato UnmanagedType.VBByRefStr è leggermente diverso. Ad esempio LPWStr
, effettua il marshalling della stringa in una stringa in stile C nativo con codifica UTF-16. Tuttavia, la firma gestita richiede il passaggio della stringa per riferimento e la firma nativa corrispondente accetta la stringa per valore. Questa distinzione consente di usare un'API nativa che accetta una stringa per valore e la modifica sul posto senza dover usare StringBuilder
. È consigliabile evitare di usare questo formato manualmente, perché è soggetto a creare confusione con le firme native e gestite non corrispondenti.
Formati di stringa per Windows
Quando si interagisce con le interfacce COM oppure OLE, probabilmente si scoprirà che le funzioni native accettano stringhe come argomenti BSTR
. È possibile usare il tipo non gestito UnmanagedType.BStr per effettuare il marshalling di una stringa come BSTR
.
Se si interagisce con API WinRT, è possibile usare il formato UnmanagedType.HString per effettuare il marshalling di una stringa come HSTRING
.
Personalizzazione dei parametri di matrice
.NET offre anche vari modi per effettuare il marshalling di parametri di matrice. Se si chiama un'API che accetta una matrice in stile C, usare il tipo non gestito UnmanagedType.LPArray. Se i valori nella matrice richiedono il marshalling personalizzato, è possibile usare il campo ArraySubType per l'attributo [MarshalAs]
a tale scopo.
Se si usano API COM, probabilmente sarà necessario effettuare il marshalling dei parametri di matrice come SAFEARRAY*
. A tale scopo, è possibile usare il tipo non gestito UnmanagedType.SafeArray. Il tipo predefinito degli elementi di SAFEARRAY
è indicato nella tabella sulla personalizzazione dei campi object
. È possibile usare i campi MarshalAsAttribute.SafeArraySubType e MarshalAsAttribute.SafeArrayUserDefinedSubType per personalizzare il tipo di elemento esatto di SAFEARRAY
.
Personalizzazione dei parametri booleani o decimali
Per informazioni sul marshalling dei parametri booleani o decimali, vedere Personalizzazione del marshalling delle strutture.
Personalizzazione dei parametri oggetto (solo Windows)
In Windows, il runtime .NET offre molti modi diversi per effettuare il marshalling dei parametri oggetto in codice nativo.
Marshalling come interfacce COM specifiche
Se l'API accetta un puntatore a un oggetto COM, è possibile usare uno dei formati UnmanagedType
seguenti per un parametro di tipo object
per indicare a .NET di effettuare il marshalling come queste interfacce specifiche:
IUnknown
IDispatch
IInspectable
Inoltre, se il tipo è contrassegnato [ComVisible(true)]
o si effettua il marshalling del tipo object
, è possibile usare il formato UnmanagedType.Interface per effettuare il marshalling dell'oggetto come un COM Callable Wrapper per la visualizzazione COM del tipo.
Marshalling come VARIANT
Se l'API nativa richiede un VARIANT
Win32, è possibile usare il formato UnmanagedType.Struct per il parametro object
per effettuare il marshalling degli oggetti come VARIANT
. Vedere la documentazione sulla personalizzazione dei campi object
per informazioni sul mapping tra tipi .NET e tipi VARIANT
.
Gestori del marshalling personalizzati
Se si vuole proiettare un'interfaccia COM nativa in un tipo gestito diverso, è possibile usare il formato UnmanagedType.CustomMarshaler
e un'implementazione di ICustomMarshaler per fornire il proprio codice di marshalling personalizzato.