Parameter marshalling aanpassen
Wanneer het standaardgedrag van de .NET Runtime-parameter marshalling niet doet wat u wilt, kunt u het System.Runtime.InteropServices.MarshalAsAttribute kenmerk gebruiken om aan te passen hoe uw parameters worden marshalled. Deze aanpassingsfuncties zijn niet van toepassing wanneer runtime-marshalling is uitgeschakeld.
Notitie
Door de bron gegenereerde interoperabiliteit voor P/Invokes en COM respecteert alleen een kleine subset van MarshalAsAttribute parameters. Het wordt aanbevolen om in plaats daarvan te gebruiken MarshalUsingAttribute voor door de bron gegenereerde interop. Zie Custom marshalling voor brongeneratie voor meer informatie.
Tekenreeksparameters aanpassen
.NET heeft verschillende indelingen voor marshalltekenreeksen. Deze methoden worden gesplitst in afzonderlijke secties in tekenreeksen in C-stijl en Windows-gerichte tekenreeksindelingen.
Tekenreeksen in C-stijl
Elk van deze indelingen geeft een door null beƫindigde tekenreeks door aan systeemeigen code. Ze verschillen door de codering van de systeemeigen tekenreeks.
System.Runtime.InteropServices.UnmanagedType Waarde |
Codering |
---|---|
LPStr | ANSI |
LPUTF8Str | UTF-8 |
LPWStr | UTF-16 |
LPTStr | UTF-16 |
De UnmanagedType.VBByRefStr indeling is iets anders. Net als LPWStr
, het marshalt de tekenreeks naar een systeemeigen C-stijl tekenreeks gecodeerd in UTF-16. Met de beheerde handtekening geeft u de tekenreeks echter op verwijzing door en de overeenkomende systeemeigen handtekening neemt de tekenreeks op waarde. Met dit onderscheid kunt u een systeemeigen API gebruiken die een tekenreeks op waarde gebruikt en deze in-place wijzigt zonder dat u een StringBuilder
. We raden u aan deze indeling handmatig te gebruiken, omdat deze gevoelig is voor verwarring met de niet-overeenkomende systeemeigen en beheerde handtekeningen.
Windows-gerichte tekenreeksindelingen
Wanneer u communiceert met COM- of OLE-interfaces, zult u waarschijnlijk merken dat de systeemeigen functies tekenreeksen als BSTR
argumenten aannemen. U kunt het UnmanagedType.BStr onbeheerde type gebruiken om een tekenreeks als een BSTR
tekenreeks te gebruiken.
Als u interactie hebt met WinRT-API's, kunt u de UnmanagedType.HString indeling gebruiken om een tekenreeks als een HSTRING
tekenreeks te gebruiken.
Matrixparameters aanpassen
.NET biedt u ook meerdere manieren om matrixparameters te marshalen. Als u een API aanroept die een C-stijlmatrix gebruikt, gebruikt u het UnmanagedType.LPArray niet-beheerde type. Als de waarden in de matrix aangepaste marshalling nodig hebben, kunt u het ArraySubType veld voor dat [MarshalAs]
kenmerk gebruiken.
Als u COM-API's gebruikt, moet u waarschijnlijk uw matrixparameters als SAFEARRAY*
zodanig marshalen. Hiervoor kunt u het UnmanagedType.SafeArray niet-beheerde type gebruiken. Het standaardtype van de elementen van de SAFEARRAY
elementen is te zien in de tabel over het aanpassen van object
velden. U kunt de MarshalAsAttribute.SafeArraySubType en MarshalAsAttribute.SafeArrayUserDefinedSubType velden gebruiken om het exacte elementtype van de SAFEARRAY
.
Booleaanse of decimale parameters aanpassen
Zie Het aanpassen van structuur marshalling voor meer informatie over het marshallen van Booleaanse of decimale parameters.
Objectparameters aanpassen (alleen Windows)
In Windows biedt de .NET-runtime een aantal verschillende manieren om marshal objectparameters te gebruiken voor systeemeigen code.
Marshalling als specifieke COM-interfaces
Als uw API een aanwijzer naar een COM-object gebruikt, kunt u een van de volgende UnmanagedType
indelingen op een object
parameter met -type gebruiken om .NET als deze specifieke interfaces te laten zien:
IUnknown
IDispatch
IInspectable
Als uw type is gemarkeerd [ComVisible(true)]
of als u het object
type marshallt, kunt u de UnmanagedType.Interface indeling gebruiken om uw object te marshalen als een COM-aanroepbare wrapper voor de COM-weergave van uw type.
Marshalling naar een VARIANT
Als uw systeemeigen API een Win32 VARIANT
gebruikt, kunt u de UnmanagedType.Struct indeling op uw object
parameter gebruiken om uw objecten als VARIANT
s te marshalen. Zie de documentatie over het aanpassen van object
velden voor een toewijzing tussen .NET-typen en VARIANT
-typen.
Aangepaste marshallers
Als u een systeemeigen COM-interface wilt projecteren in een ander beheerd type, kunt u de UnmanagedType.CustomMarshaler
indeling en een implementatie gebruiken om ICustomMarshaler uw eigen aangepaste marshallingcode op te geven.