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 StringBuilder
arquivo . 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 BSTR
arquivo .
Se você estiver interagindo com APIs do WinRT, poderá usar o UnmanagedType.HString formato para empacotar uma cadeia de caracteres como um HSTRING
arquivo .
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 deSAFEARRAY
object
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 object
parâ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 VARIANT
s. 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.