Delen via


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 BSTRtekenreeks te gebruiken.

Als u interactie hebt met WinRT-API's, kunt u de UnmanagedType.HString indeling gebruiken om een tekenreeks als een HSTRINGtekenreeks 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 objectparameter 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 VARIANTgebruikt, kunt u de UnmanagedType.Struct indeling op uw object parameter gebruiken om uw objecten als VARIANTs 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.