Кодировки и маршалинг
Примечание.
Ниже приведены инструкции по [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) |
Вы должны понимать, какое представление ожидает ваше собственное представление при выборе кодировки.