Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Когда System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute
атрибут применяется к сборке, среда выполнения отключает большую часть встроенной поддержки маршаллинга данных между управляемыми и собственными представлениями. В этой статье описываются отключенные возможности и то, как типы .NET сопоставляются с собственными типами при отключении маршаллинга.
Сценарии, в которых маршалирование отключено
DisableRuntimeMarshallingAttribute
При применении к сборке он влияет на P/Invokes и типы делегатов в сборке, а также на любые вызовы неуправляемых указателей функций в сборке. Он не влияет на типы делегатов P/Invoke или interop, определенные в других сборках. Кроме того, он не отключает маршалирование для встроенной поддержки COM-взаимодействия во время выполнения. Встроенная поддержка взаимодействия COM может быть включена или отключена с помощью коммутатора функций.
Отключенные функции
DisableRuntimeMarshallingAttribute
При применении к сборке следующие атрибуты не окажут эффекта или вызовут исключение:
- LCIDConversionAttribute на P/Invoke или делегате
-
SetLastError=true
на P/Invoke -
ThrowOnUnmappableChar=true
на P/Invoke -
BestFitMapping=true
на P/Invoke - Сигнатуры методов с вариативным числом аргументов .NET (varargs)
-
in
,ref
,out
параметры
Правила по умолчанию для маршалинга распространенных типов
При отключении маршалинга правила маршалинга по умолчанию изменяются на гораздо более простые правила. Эти правила описаны ниже. Как указано в документации по лучшим практикам взаимодействия, блитабельные типы — это типы с одинаковым макетом в управляемом и нативном коде, и поэтому они не требуют маршаллинга. Кроме того, эти правила нельзя настроить с помощью средств, упомянутых в документации по настройке маршаллинга параметров.
Ключевое слово C# | Тип .NET | Тип по умолчанию |
---|---|---|
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 на P/Invoke не действует) |
nint |
System.IntPtr |
intptr_t |
nuint |
System.UIntPtr |
uintptr_t |
System.Boolean |
bool |
|
Определяемый пользователем тип C# unmanaged без полей LayoutKind.Auto |
Рассматривается как блиттабельный тип. Все структуры с настраиваемым маршаллингом игнорируются. | |
Все остальные типы | Неподдерживаемый |
Примеры
В следующем примере показаны некоторые функции, которые включены или отключены при отключении маршаллинга среды выполнения. Чтобы продемонстрировать применение этого руководства вручную, эти примеры используются [DllImport]
в отличие от рекомендуемого [LibraryImport]
атрибута. Анализатор с идентификатором SYSLIB1054 предоставляет дополнительные рекомендации при использовании [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