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.