Freigeben über


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.