Personalizar o empacotamento de parâmetros

Quando o comportamento de empacotamento de parâmetros padrão do tempo de execução do .NET não faz o que você deseja, use pode usar o System.Runtime.InteropServices.MarshalAsAttribute atributo para personalizar como seus parâmetros são empacotados. Esses recursos de personalização não se aplicam quando a organização em tempo de execução está desabilitada.

Nota

A interoperabilidade gerada pela fonte para P/Invokes e COM respeita apenas um pequeno subconjunto de MarshalAsAttribute parâmetros on. Em vez disso, recomenda-se o uso MarshalUsingAttribute para interoperabilidade gerada pela fonte. Para obter mais informações, consulte Marshalling personalizado para geração de origem.

Personalizando parâmetros de cadeia de caracteres

O .NET tem uma variedade de formatos para organizar cadeias de caracteres. Esses métodos são divididos em seções distintas em cadeias de caracteres no estilo C e formatos de cadeia de caracteres centrados no Windows.

Cordas estilo C

Cada um desses formatos passa uma cadeia de caracteres terminada em nulo para o código nativo. Eles diferem pela codificação da cadeia de caracteres nativa.

System.Runtime.InteropServices.UnmanagedType valor Codificação
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

O UnmanagedType.VBByRefStr formato é ligeiramente diferente. Como LPWStr, ele marshals a string para uma string nativa de estilo C codificada em UTF-16. No entanto, a assinatura gerenciada faz com que você passe a cadeia de caracteres por referência e a assinatura nativa correspondente leva a cadeia de caracteres por valor. Essa distinção permite que você use uma API nativa que usa uma cadeia de caracteres por valor e a modifica in-loco sem precisar usar um StringBuilderarquivo . Recomendamos não usar manualmente esse formato, pois ele é propenso a causar confusão com as assinaturas nativas e gerenciadas incompatíveis.

Formatos de cadeia de caracteres centrados no Windows

Ao interagir com interfaces COM ou OLE, você provavelmente descobrirá que as funções nativas usam cadeias de caracteres como BSTR argumentos. Você pode usar o UnmanagedType.BStr tipo não gerenciado para empacotar uma cadeia de caracteres como um BSTRarquivo .

Se você estiver interagindo com APIs do WinRT, poderá usar o UnmanagedType.HString formato para empacotar uma cadeia de caracteres como um HSTRINGarquivo .

Personalizando parâmetros de matriz

O .NET também fornece várias maneiras de organizar parâmetros de matriz. Se você estiver chamando uma API que usa uma matriz no estilo C, use o UnmanagedType.LPArray tipo não gerenciado. Se os valores na matriz precisarem de empacotamento personalizado, você poderá usar o ArraySubType[MarshalAs] campo no atributo para isso.

Se você estiver usando APIs COM, provavelmente terá que organizar seus parâmetros de matriz como SAFEARRAY*s. Para fazer isso, você pode usar o UnmanagedType.SafeArray tipo não gerenciado. O tipo padrão dos elementos do pode ser visto na tabela sobre campos deSAFEARRAYobject personalização. Você pode usar os MarshalAsAttribute.SafeArraySubType campos e MarshalAsAttribute.SafeArrayUserDefinedSubType para personalizar o tipo exato de elemento do SAFEARRAY.

Personalizando parâmetros booleanos ou decimais

Para obter informações sobre a organização de parâmetros booleanos ou decimais, consulte Customizing structure marshalling.

Personalizando parâmetros de objeto (somente Windows)

No Windows, o tempo de execução do .NET fornece várias maneiras diferentes de empacotar parâmetros de objeto para código nativo.

Marshalling como interfaces COM específicas

Se sua API levar um ponteiro para um objeto COM, você poderá usar qualquer um dos seguintes UnmanagedType formatos em um objectparâmetro -typed para dizer ao .NET para empacotar como estas interfaces específicas:

  • IUnknown
  • IDispatch
  • IInspectable

Além disso, se o seu tipo estiver marcado [ComVisible(true)] ou se você estiver organizando o object tipo, você poderá usar o UnmanagedType.Interface formato para empacotar seu objeto como um wrapper chamável COM para a visualização COM do seu tipo.

Marshalling para um VARIANT

Se sua API nativa usa um Win32 VARIANT, você pode usar o UnmanagedType.Struct formato em seu object parâmetro para empacotar seus objetos como VARIANTs. Consulte a documentação sobre personalização de object campos para obter um mapeamento entre tipos e VARIANT tipos .NET.

Marshallers personalizados

Se você quiser projetar uma interface COM nativa em um tipo gerenciado diferente, você pode usar o UnmanagedType.CustomMarshaler formato e uma implementação de para fornecer seu próprio código de ICustomMarshaler empacotamento personalizado.