Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Когда 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