Share via


Charsets en marshalling

Notitie

De volgende richtlijnen zijn bedoeld voor [DllImport] gebruik en moeten handmatig worden gevolgd voor de juiste resultaten. .NET 7+ gebruikers moeten overwegen in plaats daarvan te gebruiken [LibraryImport] . Een in-box Roslyn Analyzer (standaard ingeschakeld) biedt de vereiste richtlijnen voor het [LibraryImport] kenmerk in uw code.

De manier waarop char waarden, string objecten en System.Text.StringBuilder objecten worden marshalled, is afhankelijk van de waarde van het CharSet veld op de P/Invoke of structuur. U kunt de CharSet waarde van een P/Invoke instellen door het veld in te stellen bij het DllImportAttribute.CharSet declareren van uw P/Invoke. Als u het CharSet voor een type wilt instellen, stelt u het StructLayoutAttribute.CharSet veld in voor uw klasse- of structdeclaratie. Wanneer deze kenmerkvelden niet zijn ingesteld, is het aan de taalcompilator om te bepalen welke CharSet te gebruiken. C#, Visual Basic en F# gebruiken standaard de None tekenset, die hetzelfde gedrag heeft als de Ansi tekenset.

Als de System.Runtime.InteropServices.DefaultCharSetAttribute module wordt toegepast op de module in C# of Visual Basic-code, verzendt de C# of Visual Basic-compiler de opgegeven CharSet standaard in plaats van te gebruiken CharSet.None. F# biedt geen ondersteuning voor de DefaultCharSetAttribute, en wordt altijd standaard verzonden CharSet.None .

In de volgende tabel ziet u een toewijzing tussen elke tekenset en hoe een teken of tekenreeks wordt weergegeven wanneer deze tekenset wordt weergegeven:

CharSet Waarde Windows .NET Core 2.2 en eerder op Unix .NET Core 3.0 en hoger en Mono op Unix
Ansi char (de standaardinstelling van het systeemCodepagina voor 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)

Zorg ervoor dat u weet welke representatie uw systeemeigen weergave verwacht bij het kiezen van uw charset.