Zeichensätze und Marshalling
Hinweis
Die folgenden Anleitungen gelten für [DllImport]
Verwendung und müssen manuell für die richtigen Ergebnisse befolgt werden. .NET 7+-Benutzer sollten stattdessen [LibraryImport]
verwenden. Ein vordefinierter Roslyn-Analyzer (standardmäßig aktiviert) enthält erforderliche Anleitungen für das [LibraryImport]
-Attribut in Ihrem Code.
Die Art und Weise, wie char
-Werte, string
-Objekte und System.Text.StringBuilder
-Objekte gemarshallt werden, hängt vom Wert im Feld CharSet
in P/Invoke oder der Struktur ab. Sie können den CharSet
von P/Invoke festlegen, indem Sie beim Deklarieren von P/Invoke das Feld DllImportAttribute.CharSet bestimmen. Um den CharSet
für einen Typ festzulegen, bestimmen Sie das Feld StructLayoutAttribute.CharSet in Ihrer Klassen- oder Strukturdeklaration. Wenn diese Attributfelder nicht festgelegt sind, bestimmt der Sprachcompiler, welcher CharSet
verwendet wird. C#, Visual Basic und F# verwenden standardmäßig den None-Zeichensatz, der dasselbe Verhalten wie der Ansi-Zeichensatz aufweist.
Wenn System.Runtime.InteropServices.DefaultCharSetAttribute auf das Modul in C#- oder Visual Basic-Code angewendet wird, gibt der C#- oder Visual Basic-Compiler standardmäßig das bereitgestellte CharSet
aus, anstatt CharSet.None
zu verwenden. F# unterstützt das DefaultCharSetAttribute
nicht und gibt standardmäßig CharSet.None
aus.
Die folgende Tabelle zeigt eine Zuordnung zwischen den einzelnen Zeichensätzen und wie ein Zeichen oder eine Zeichenkette dargestellt wird, wenn sie mit diesem Zeichensatz gemarshallt wird:
CharSet -Wert |
Windows | .NET Core 2.2 und früher unter Unix | .NET Core 3.0 und höher und Mono unter Unix |
---|---|---|---|
Ansi |
char (die standardmäßige Windows-ANSI-Codepage des Systems) |
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) |
Stellen Sie sicher, dass Sie wissen, welche Darstellung Ihre native Darstellung erwartet, wenn Sie Ihren Zeichensatz auswählen.