Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 desativados e como os tipos .NET são mapeados para tipos nativos quando o marshalling está desativado.
Cenários em que o marshalling 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. Não afeta nenhum tipo de delegado P/Invoke ou interop definidos noutros assemblies. Isto também não desativa o marshalling para o suporte de interoperabilidade COM nativo do tempo de execução. O suporte de interoperabilidade COM integrado pode ser ativado ou desativado através de uma chave de funcionalidade.
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étodos com argumentos variádicos em .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 adaptadas com as ferramentas mencionadas na documentação sobre adaptação da formatação 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_t
CharSet ( 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 com LayoutKind.Auto |
Tratada como um tipo blittable (um tipo que pode ser copiado sem conversão). Todo empacotamento personalizado de estruturas é ignorado. | |
Todos os outros tipos | sem suporte |
Exemplos
O exemplo a seguir mostra algumas funcionalidades que são ativadas ou desativadas quando o marshalling em tempo de execução está desativado. Para demonstrar a aplicação manual desta orientação, estes exemplos usam [DllImport]
em oposição ao atributo recomendado [LibraryImport]
. O analisador com ID SYSLIB1054 fornece orientação adicional quando utilizas [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