Compartilhar via


Conjuntos de caracteres e marshaling

Observação

As diretrizes a seguir são para uso de [DllImport] e precisam ser seguidas manualmente para obtenção de resultados corretos. Em vez disso, os usuários do .NET 7+ devem considerar o uso de [LibraryImport]. Um analisador Roslyn in-box (habilitado por padrão) fornecerá as diretrizes necessárias para o atributo [LibraryImport] em 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 CharSet para um tipo, configure o campo StructLayoutAttribute.CharSet na declaração do struct ou classe. Se esses campos do atributo não estiverem definidos, caberá ao compilador de linguagem determinar qual CharSet a ser usado. C#, Visual Basic e F# usam o conjunto de caracteres None por padrão, o qual tem o mesmo comportamento que o conjunto de caracteres Ansi.

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

A tabela a seguir mostra um mapeamento entre cada conjunto de caracteres e como um caractere ou uma cadeia de caracteres são representados quando realizam marshaling com esse conjunto de caracteres:

CharSet valor Windows .NET Core 2.2 e anteriores no Unix .NET Core 3.0 e posteriores e Mono no Unix
Ansi char (a página de códigos do Windows (ANSI) padrão 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)

Quando escolher o conjunto de caracteres, saiba qual será a representação esperada por sua representação nativa.