Partilhar via


Charsets e marshalling

Nota

As orientações a seguir são para [DllImport] uso e devem ser seguidas manualmente para obter resultados corretos. Os usuários do .NET 7+ devem considerar o uso [LibraryImport] em vez disso. Um analisador Roslyn in-box (ativado por padrão) fornecerá a orientação necessária para o [LibraryImport] atributo em seu código.

A maneira como char valores, string objetos e System.Text.StringBuilder objetos são organizados depende do valor do CharSet campo no P/Invoke ou na estrutura. Você pode definir o CharSet de um P/Invoke definindo o DllImportAttribute.CharSet campo ao declarar seu P/Invoke. Para definir o CharSet para um tipo, defina o StructLayoutAttribute.CharSet campo em sua declaração de classe ou struct. Quando esses campos de atributo não são definidos, cabe ao compilador de linguagem determinar qual CharSet usar. C#, Visual Basic e F# usam o None charset por padrão, que tem o mesmo comportamento que o Ansi charset.

Se o System.Runtime.InteropServices.DefaultCharSetAttribute for aplicado no módulo em código C# ou Visual Basic, o compilador C# ou Visual Basic emitirá o fornecido CharSet por padrão em vez de usar CharSet.None. F# não suporta o 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 cadeia de caracteres é representado quando empacotado com esse conjunto de caracteres:

CharSet valor Windows .NET Core 2.2 e versões anteriores no Unix .NET Core 3.0 e posterior e Mono em Unix
Ansi char (o padrão do sistemaPágina de código do Windows (ANSI) 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)

Certifique-se de saber qual representação sua representação nativa espera ao escolher seu charset.