Поделиться через


Шарсеты и маршаллинг

Замечание

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

Способ маршалинга значений char, объектов string и объектов System.Text.StringBuilder зависит от значения поля CharSet, связанным как с P/Invoke, так и со структурой. Вы можете задать CharSet для P/Invoke, задав поле 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 Виндоус .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)

Убедитесь, что вы знаете, какое представление ожидается вашей внутренней кодировкой при выборе набора символов.