Кодировки и маршалинг

Способ маршалирования значений char, объектов string и объектов System.Text.StringBuilder зависит от значения, заданного в поле CharSet P/Invoke или структуры. Для P/Invoke можно указать CharSet, задав в поле DllImportAttribute.CharSet при объявлении P/Invoke. Чтобы указать CharSet для типа, задайте StructLayoutAttribute.CharSet в декларации класса или структуры. Если эти поля атрибута не заданы, используемое значение CharSet определяется компилятором языка. C#, Visual Basic и F# используют None набор символов по умолчанию, который имеет то же поведение, что и набор символовAnsi.

Если модуль System.Runtime.InteropServices.DefaultCharSetAttribute применяется в коде C# или Visual Basic, компилятор C# или Visual Basic будет выдавать предоставленный CharSet по умолчанию код вместо использованияCharSet.None. F# не поддерживает DefaultCharSetAttributeи всегда выдает CharSet.None по умолчанию.

В следующей таблице показаны кодировки и способ представления символа или строки при маршалировании в этой кодировке.

ЗначениеCharSet Windows .NET Core 2.2 и более ранние версии в Unix .NET Core 3.0 и более поздние версии, Mono в Unix
Ansi char (системная кодовая страница 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)

Вы должны понимать, какое представление ожидает ваше собственное представление при выборе кодировки.