Set di caratteri e marshalling

Il modo in cui viene effettuato il marshalling dei valori char, degli oggetti string e degli oggetti System.Text.StringBuilder dipende dal valore del campo CharSet per P/Invoke o la struttura. È possibile impostare il CharSet di P/Invoke, impostando il campo DllImportAttribute.CharSet al momento della dichiarazione di P/Invoke. Per impostare l'oggetto CharSet per un tipo, impostare il campo StructLayoutAttribute.CharSet nella dichiarazione di classe o struct. Quando questi campi attributo non vengono impostati, dipende dal compilatore del linguaggio determinare quale CharSet usare. Per impostazione predefinita, C#, Visual Basic e F# usano il set di caratteri None, che ha lo stesso comportamento del set di caratteri Ansi.

Se l'oggetto System.Runtime.InteropServices.DefaultCharSetAttribute viene applicato al modulo nel codice C# o Visual Basic, il compilatore C# o Visual Basic genererà l'oggetto fornito CharSet per impostazione predefinita anziché usare CharSet.None. F# non supporta DefaultCharSetAttribute e genera sempre CharSet.None per impostazione predefinita.

La tabella seguente mostra il mapping tra ogni set di caratteri e la rappresentazione di un carattere o una stringa quando sottoposto a marshalling con tale set di caratteri:

Valore CharSet Windows .NET Core 2.2 e versioni precedenti in Unix .NET core 3.0 e versioni successive e Mono in Unix
Ansi char (tabella codici Windows (ANSI) predefinita del 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)

Assicurarsi di conoscere la rappresentazione prevista dalla rappresentazione nativa quando si seleziona il set di caratteri.