Personalización de la serialización de parámetros

Si el comportamiento predeterminado de serialización de parámetros del runtime de .NET no hace lo que se quiere, se puede usar el atributo System.Runtime.InteropServices.MarshalAsAttribute 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 código fuente para los elementos P/Invoke y COM solo respeta un pequeño subconjunto de MarshalAsAttribute en los 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 Serialización personalizada para la generación de código fuente.

Parámetros de cadenas de conexión

.NET tiene una serie de formatos de serialización de cadenas. Estos métodos se dividen en secciones distintas en cadenas de estilo C y formatos de cadena centrados en Windows.

Cadenas de estilo C

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

Valor deSystem.Runtime.InteropServices.UnmanagedType Codificación
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

El formato UnmanagedType.VBByRefStr es un poco diferente. Al igual que LPWStr, serializa la cadena a una cadena de estilo C nativa 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 toma una cadena por valor y la modifica en contexto sin tener que usar StringBuilder. Se recomienda no usar manualmente este formato, ya que es propenso a provocar confusión con las firmas no coincidentes nativas y administradas.

Formatos de cadena centrados en Windows

Al interactuar con interfaces COM u OLE, probablemente descubrirá que las funciones nativas toman cadenas como argumentos BSTR. Puede usar el tipo UnmanagedType.BStr no administrado para serializar una cadena como BSTR.

Si está interactuando con API de WinRT, puede usar el formato UnmanagedType.HString para serializar una cadena como HSTRING.

Personalización de parámetros de matriz

.NET también proporciona varias maneras de serializar los parámetros de matriz. 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 tipo UnmanagedType.SafeArray no administrado. El tipo predeterminado de los elementos de SAFEARRAY puede verse en la tabla sobre cómo personalizar campos object. Puede usar campos MarshalAsAttribute.SafeArraySubType 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, vea 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 diferentes formas de serializar parámetros de objetos al 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 el tipo se marca como [ComVisible(true)] o si está serializando el tipo object, puede usar el formato UnmanagedType.Interface para serializar el objeto como un contenedor CCW para la vista COM del 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 administrado diferente, puede usar el formato UnmanagedType.CustomMarshaler y una implementación de ICustomMarshaler para proporcionar su propio código de serialización personalizado.