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.