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.