Partilhar via


Personalizar a serialização de parâmetros

Quando o comportamento de marshalling de parâmetros padrão do runtime do .NET não faz o que você deseja, pode usar o atributo System.Runtime.InteropServices.MarshalAsAttribute para personalizar como seus parâmetros são marshallados. Essas funcionalidades de personalização não se aplicam quando o marshalling em tempo de execução está desativado.

Observação

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. Estes métodos estão divididos em seções distintas: 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 string nativa.

System.Runtime.InteropServices.UnmanagedType valor Codificação
LPStr ANSI (Instituto Nacional Americano de Normalização)
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

O UnmanagedType.VBByRefStr formato é ligeiramente diferente. Como LPWStr, ele converte a string para uma string nativa de estilo C codificada em UTF-16. No entanto, a assinatura gerenciada requer que a string seja passada por referência, enquanto a assinatura nativa correspondente a recebe por valor. Esta distinção permite que o utilizador use uma API nativa que utiliza uma string por valor e a modifica no local sem precisar usar StringBuilder. 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 mapear uma cadeia de caracteres como um BSTR tipo.

Se estiveres interagindo com APIs do WinRT, podes usar o formato UnmanagedType.HString para marshalar uma cadeia de caracteres como um HSTRING.

Personalizar 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 SAFEARRAY pode ser visto na tabela sobre personalização de campos object. 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 marshalização de parâmetros booleanos ou decimais, consulte Personalizar a marshalização de estruturas.

Personalizando parâmetros de objeto (somente Windows)

No Windows, o ambiente de execução do .NET oferece várias formas de passar parâmetros de objeto para código nativo.

Marshalling como interfaces COM específicas

Se a sua API aceitar um ponteiro para um objeto COM, você poderá usar qualquer um dos seguintes UnmanagedType formatos em um parâmetro do tipo object para fazer a marshaling 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.

Marshalização para um VARIANT

Se a sua API nativa usar um Win32 VARIANT, pode utilizar o formato UnmanagedType.Struct no seu parâmetro object para marcar os seus objetos como VARIANTs. Consulte a documentação sobre campos personalizados para obter um mapeamento entre tipos .NET e tipos VARIANT.

Marshallers personalizados

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