Compartilhar via


Conjuntos de caracteres e marshaling

Observação

As diretrizes a seguir são para o uso de [DllImport] e devem ser seguidas manualmente para garantir resultados corretos. Em vez disso, os usuários do .NET 7+ devem considerar o uso [LibraryImport] . Um analisador Roslyn integrado (habilitado por padrão) fornecerá as diretrizes necessárias para o atributo [LibraryImport] no seu código.

A maneira pela qual os valores char, os objetos string e os objetos System.Text.StringBuilder realizam marshaling depende do valor do campo CharSet, no P/Invoke ou na estrutura. Para definir o CharSet de um P/Invoke, configure o campo DllImportAttribute.CharSet quando declarar o P/Invoke. Para definir o tipo utilizando o CharSet, defina o campo StructLayoutAttribute.CharSet na declaração de sua classe ou struct. Quando esses campos de atributo não são definidos, cabe ao compilador de idiomas determinar qual CharSet usar. C#, Visual Basic e F# usam o None conjunto de caracteres por padrão, que tem o mesmo comportamento que o Ansi conjunto de caracteres.

Se o System.Runtime.InteropServices.DefaultCharSetAttribute for aplicado ao módulo no código em C# ou Visual Basic, o compilador correspondente emitirá o fornecido CharSet por padrão em vez de usar CharSet.None. O F# não dá suporte ao DefaultCharSetAttributee sempre emite CharSet.None por padrão.

A tabela a seguir mostra um mapeamento entre cada conjunto de caracteres e como um caractere ou cadeia de caracteres é representado quando empacotado com esse conjunto de caracteres:

Valor CharSet Windows .NET Core 2.2 e anterior no Unix .NET Core 3.0 e posterior e Mono no Unix
Ansi char (a página de código padrão do Windows (ANSI) do sistema) char (UTF-8) char (UTF-8)
Unicode wchar_t (UTF-16) char16_t (UTF-16) char16_t (UTF-16)
Auto wchar_t (UTF-16) char16_t (UTF-16) char (UTF-8)

Verifique qual representação sua representação nativa espera ao escolher seu conjunto de caracteres.