Бөлісу құралы:


Отключено маршалирование среды выполнения

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
  • Сигнатуры метода аргумента variadic .NET (varargs)
  • inout, , refпараметры

Правила маршалинга общих типов

При отключении маршалинга правила маршалинга по умолчанию изменяются на гораздо более простые правила. Эти правила описаны ниже. Как упоминание в документации по рекомендациям по взаимодействиям, типы с различенными типами имеют одинаковый макет в управляемом и машинном коде, и, как это, не требует маршаллинга. Кроме того, эти правила нельзя настроить с помощью инструментов, упоминание в документации по настройке маршаллинга параметров.

Ключевое слово 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