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

Примечание.

Ниже приведены инструкции по [DllImport] использованию и их следует вручную следовать за правильными результатами. Вместо этого следует использовать [LibraryImport] .NET 7+ пользователей. Встроенный анализатор Roslyn (включен по умолчанию) предоставит необходимые рекомендации для атрибута [LibraryImport] в коде.

Способ маршалирования значений 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)

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