Freigeben über


Zeichensätze und Marshalling

Hinweis

Die folgenden Hinweise sind für die Verwendung von [DllImport] und müssen für korrekte Ergebnisse manuell befolgt werden. .NET 7+-Benutzer sollten die Verwendung von [LibraryImport] stattdessen in Betracht ziehen. 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 Typ festzulegen, legen Sie das StructLayoutAttribute.CharSet Feld für die Klasse oder Strukturdeklaration fest. Wenn diese Attributfelder nicht festgelegt sind, muss der Sprachcompiler bestimmen, welcher CharSet verwendet werden soll. C#, Visual Basic und F# verwenden standardmäßig das None Zeichenset, das das gleiche Verhalten wie das Ansi Zeichenset aufweist.

Wenn System.Runtime.InteropServices.DefaultCharSetAttribute im C#- oder Visual Basic-Code auf das Modul angewendet wird, emittiert der C#- oder Visual Basic-Compiler standardmäßig den bereitgestellten CharSet, anstatt CharSet.None zu verwenden. F# unterstützt nicht das DefaultCharSetAttribute, und gibt immer standardmäßig aus CharSet.None .

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 Fenster .NET Core 2.2 und früher auf Unix .NET Core 3.0 und höher und Mono unter Unix
Ansi char(die systemstandardmäßige Windows (ANSI) Codepage 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.