Empacotamento de tempo de execução desativado

Quando o System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute atributo é aplicado a um assembly, o tempo de execução desabilita a maioria do suporte interno para empacotamento de dados entre representações gerenciadas e nativas. Este artigo descreve os recursos que estão desabilitados e como os tipos .NET são mapeados para tipos nativos quando a empacotação está desabilitada.

Cenários em que o agrupamento está desativado

Quando o DisableRuntimeMarshallingAttribute é aplicado a um assembly, ele afeta os tipos P/Invokes e Delegate no assembly, bem como quaisquer chamadas para ponteiros de função não gerenciados no assembly. Ele não afeta nenhum tipo de delegado P/Invoke ou interoperabilidade definido em outros assemblies. Ele também não desabilita o empacotamento para o suporte de interoperabilidade COM interno do tempo de execução. O suporte de interoperabilidade COM integrado pode ser ativado ou desativado através de uma opção de recurso.

Funcionalidades desativadas

Quando o DisableRuntimeMarshallingAttribute é aplicado a um assembly, os seguintes atributos não terão efeito ou lançarão uma exceção:

  • LCIDConversionAttribute em um P/Invoke ou um delegado
  • SetLastError=true em um P/Invoke
  • ThrowOnUnmappableChar=true em um P/Invoke
  • BestFitMapping=true em um P/Invoke
  • Assinaturas de método de argumento variádico do .NET (varargs)
  • in, ref, out parâmetros

Regras supletivas para o agrupamento de tipos comuns

Quando o marshalling é desativado, as regras para o marshalling padrão mudam para regras muito mais simples. Estas regras são descritas abaixo. Conforme mencionado na documentação de práticas recomendadas de interoperabilidade, os tipos blittable são tipos com o mesmo layout em código gerenciado e nativo e, como tal, não exigem nenhum empacotamento. Além disso, essas regras não podem ser personalizadas com as ferramentas mencionadas na documentação sobre personalização de marshalling de parâmetros.

Palavra-chave 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_tCharSet( no P/Invoke não tem efeito)
nint System.IntPtr intptr_t
nuint System.UIntPtr uintptr_t
System.Boolean bool
Tipo de C# unmanaged definido pelo usuário sem campos comLayoutKind.Auto Tratada como um tipo blittable. Todo o empacotamento de estruturas personalizado é ignorado.
Todos os outros tipos sem suporte

Exemplos

O exemplo a seguir mostra alguns recursos que são habilitados ou desabilitados quando a organização em tempo de execução está desabilitada:

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