Compartir por


Personalización del manejo de parámetros

Cuando el comportamiento de serialización de parámetros predeterminados del entorno de ejecución de .NET no hace lo que desea, use el System.Runtime.InteropServices.MarshalAsAttribute atributo para personalizar cómo se serializan los parámetros. Estas características de personalización no se aplican cuando la serialización en tiempo de ejecución está deshabilitada.

Nota:

La interoperabilidad generada por el origen para P/Invokes y COM solo respeta un pequeño subconjunto de MarshalAsAttribute en parámetros. Se recomienda usar MarshalUsingAttribute en su lugar para la interoperabilidad generada por el código fuente. Para obtener más información, consulte Marshalling personalizado para la generación de código fuente.

Personalización de parámetros de cadena

.NET tiene una variedad de formatos para manejar cadenas. Estos métodos se dividen en secciones distintas sobre cadenas de estilo C y sobre formatos de cadena centrados en Windows.

Cadenas de estilo C

Cada uno de estos formatos pasa una cadena terminada en NULL al código nativo. Difieren en la codificación de la cadena nativa.

System.Runtime.InteropServices.UnmanagedType valor Codificación
LPStr ANSI (Instituto Nacional Estadounidense de Estándares)
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

El UnmanagedType.VBByRefStr formato es ligeramente diferente. Al igual que LPWStr, gestiona la cadena en una cadena nativa en estilo C codificada en UTF-16. Sin embargo, la firma administrada que tiene que pasar en la cadena por referencia y la firma nativa coincidente toma la cadena por valor. Esta distinción permite usar una API nativa que recibe una cadena por valor y la modifica in situ sin tener que usar StringBuilder. Se recomienda no utilizar manualmente este formato, ya que es propenso a causar confusión debido a las firmas nativas y administradas que no coinciden.

Formatos de cadena centrados en Windows

Cuando interactúes con interfaces COM o OLE, es probable que las funciones nativas tomen cadenas como argumentos BSTR. Puede usar el tipo UnmanagedType.BStr no administrado para serializar una cadena como BSTR.

Si interactúa con las API de WinRT, puede usar el formato UnmanagedType.HString para procesar una cadena como HSTRING.

Personalización de parámetros de matriz

.NET también proporciona varias maneras de gestionar los parámetros de array. Si está llamando a una API que toma una matriz de estilo C, use el tipo UnmanagedType.LPArray no administrado. Si los valores de la matriz necesitan una serialización personalizada, puede usar el campo ArraySubType en el atributo [MarshalAs] de dicho campo.

Si usa API de COM, probablemente tendrá que serializar los parámetros de matriz como SAFEARRAY*. Para ello, puede usar el UnmanagedType.SafeArray tipo no administrado. El tipo predeterminado de los elementos de SAFEARRAY se puede ver en la tabla sobre la personalización de object campos. Puede usar los MarshalAsAttribute.SafeArraySubType campos y MarshalAsAttribute.SafeArrayUserDefinedSubType para personalizar el tipo de elemento exacto de SAFEARRAY.

Personalización de parámetros booleanos o decimales

Para obtener información sobre la serialización de parámetros booleanos o decimales, consulte Personalización de la serialización de estructuras.

Personalización de parámetros de objeto (solo Windows)

En Windows, el entorno de ejecución de .NET proporciona varias maneras diferentes de adaptar parámetros de objeto en código nativo.

Serialización como interfaces COM específicas

Si la API toma un puntero a un objeto COM, puede usar cualquiera de los siguientes formatos UnmanagedType en un parámetro con el tipo object para indicar a .NET que serialice estas interfaces específicas:

  • IUnknown
  • IDispatch
  • IInspectable

Además, si su tipo está marcado con [ComVisible(true)] o está gestionando el tipo object, puede usar el formato UnmanagedType.Interface para gestionar su objeto como un envoltorio invocable COM para la vista COM de su tipo.

Serialización a VARIANT

Si la API nativa toma un tipo VARIANT de Win32, puede usar el formato UnmanagedType.Struct en su parámetro object para serializar los objetos como VARIANT. Consulte la documentación sobre cómo personalizar campos object para realizar una asignación entre tipos .NET y VARIANT.

Serializadores personalizados

Si desea proyectar una interfaz COM nativa en un tipo gestionado distinto, puede utilizar el formato UnmanagedType.CustomMarshaler y una implementación de ICustomMarshaler para proporcionar su propio código de marshalización personalizado.