Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Cuando el System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute atributo se aplica a un ensamblado, el entorno de ejecución deshabilita la mayoría del soporte integrado para el intercambio de datos entre representaciones administradas y nativas. En este artículo se describen las características que se deshabilitan y cómo se asignan los tipos de .NET a los tipos nativos al deshabilitar la serialización.
Escenarios en los que la serialización está deshabilitada
Cuando se aplica DisableRuntimeMarshallingAttribute a un ensamblado, afecta a los tipos P/Invokes y Delegate del ensamblado, así como a las llamadas a punteros de función no administrada del ensamblado. No afecta a ningún tipo delegado P/Invoke o de interoperabilidad definido en otros ensamblados. Tampoco deshabilita la serialización en la compatibilidad integrada de interoperabilidad COM del runtime. La compatibilidad integrada con la interoperabilidad COM se puede habilitar o deshabilitar a través de un modificador de características.
Características deshabilitadas
DisableRuntimeMarshallingAttribute Cuando se aplica a un ensamblado, los atributos siguientes no tendrán ningún efecto ni producirán una excepción:
- LCIDConversionAttribute en un tipo P/Invoke o un delegado
-
SetLastError=trueen un tipo P/Invoke -
ThrowOnUnmappableChar=trueen un tipo P/Invoke -
BestFitMapping=trueen un tipo P/Invoke - Firmas de métodos de argumentos variádicos en .NET (varargs)
-
in,ref,outparámetros
Reglas predeterminadas para serializar tipos comunes
Cuando la serialización está deshabilitada, las reglas de serialización predeterminada cambian a reglas mucho más sencillas. Estas reglas se describen a continuación. Como se menciona en la documentación sobre prácticas recomendadas de interoperabilidad, los tipos blittable son tipos con el mismo diseño en código administrado y nativo, por lo que no requieren ningún procesamiento. Además, estas reglas no se pueden personalizar con las herramientas mencionadas en la documentación sobre la personalización de la serialización de parámetros.
| Palabra clave de C# | Tipo .NET | Tipo nativo |
|---|---|---|
byte |
System.Byte |
uint8_t |
sbyte |
System.SByte |
int8_t |
short |
System.Int16 |
int16_t |
ushort |
System.UInt16 |
uint16_t |
int |
System.Int32 |
int32_t |
uint |
System.UInt32 |
uint32_t |
long |
System.Int64 |
int64_t |
ulong |
System.UInt64 |
uint64_t |
char |
System.Char |
char16_t (CharSet en P/Invoke no tiene ningún efecto) |
nint |
System.IntPtr |
intptr_t |
nuint |
System.UIntPtr |
uintptr_t |
System.Boolean |
bool |
|
Tipo C# unmanaged definido por el usuario sin campos con LayoutKind.Auto |
Se trata como un tipo que puede transferirse en bloque de bits. Se omite toda Personalización de la serialización de estructuras. | |
| Todos los demás tipos | no admitido |
Ejemplos
En el ejemplo siguiente se muestran algunas características que están habilitadas o deshabilitadas cuando la serialización en tiempo de ejecución está deshabilitada. Para demostrar la aplicación manual de esta guía, estos ejemplos usan [DllImport] en lugar del atributo recomendado [LibraryImport] . El analizador con id . SYSLIB1054 proporciona instrucciones adicionales al usar [LibraryImport].
using System.Runtime.InteropServices;
struct Unmanaged
{
int i;
}
[StructLayout(LayoutKind.Auto)]
struct AutoLayout
{
int i;
}
struct StructWithAutoLayoutField
{
AutoLayout f;
}
[UnmanagedFunctionPointer] // OK: UnmanagedFunctionPointer attribute is supported
public delegate void Callback();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] // OK: Specifying a calling convention is supported
public delegate void Callback2(int i); // OK: primitive value types are allowed
[DllImport("NativeLibrary", EntryPoint = "CustomEntryPointName")] // OK: Specifying a custom entry-point name is supported
public static extern void Import(int i);
[DllImport("NativeLibrary", CallingConvention = CallingConvention.Cdecl)] // OK: Specifying a custom calling convention is supported
public static extern void Import(int i);
[UnmanagedCallConv(new[] { typeof(CallConvCdecl) })] // OK: Specifying a custom calling convention is supported
[DllImport("NativeLibrary")]
public static extern void Import(int i);
[DllImport("NativeLibrary", EntryPoint = "CustomEntryPointName", CharSet = CharSet.Unicode, ExactSpelling = false)] // OK: Specifying a custom entry-point name and using CharSet-based lookup is supported
public static extern void Import(int i);
[DllImport("NativeLibrary")] // OK: Not explicitly specifying an entry-point name is supported
public static extern void Import(Unmanaged u); // OK: unmanaged type
[DllImport("NativeLibrary")] // OK: Not explicitly specifying an entry-point name is supported
public static extern void Import(StructWithAutoLayoutField u); // Error: unmanaged type with auto-layout field
[DllImport("NativeLibrary")]
public static extern void Import(Callback callback); // Error: managed types are not supported when runtime marshalling is disabled