Zestawy znaków i marshaling
Uwaga
Poniższe wskazówki są przeznaczone do [DllImport]
użycia i muszą być ręcznie przestrzegane w celu uzyskania poprawnych wyników. Użytkownicy platformy .NET 7+ powinni rozważyć użycie zamiast tego [LibraryImport]
. Wbudowany analizator Roslyn (domyślnie włączony) udostępnia wymagane wskazówki dotyczące atrybutu [LibraryImport]
w kodzie.
Sposób, w jaki char
wartości, string
obiekty i System.Text.StringBuilder
obiekty są ukierunkowane, zależy od wartości CharSet
pola na P/Invoke lub struktury. Element P/Invoke można ustawić CharSet
, ustawiając DllImportAttribute.CharSet pole podczas deklarowania P/Invoke. Aby ustawić CharSet
dla typu, ustaw StructLayoutAttribute.CharSet pole w deklaracji klasy lub struktury. Jeśli te pola atrybutów nie są ustawione, należy do kompilatora języka w celu określenia, które CharSet
z nich mają być używane. Język C#, Visual Basic i F# domyślnie używają None zestawu znaków, który ma takie samo zachowanie jak Ansi zestaw znaków.
System.Runtime.InteropServices.DefaultCharSetAttribute Jeśli element jest stosowany w module w kodzie C# lub Visual Basic, kompilator języka C# lub Visual Basic będzie domyślnie emitować dostarczone CharSet
zamiast używać polecenia CharSet.None
. Język F# nie obsługuje elementu DefaultCharSetAttribute
i zawsze emituje CharSet.None
domyślnie.
W poniższej tabeli przedstawiono mapowanie między poszczególnymi znakami i sposobem reprezentowania znaku lub ciągu w przypadku działania z tym zestawem znaków:
CharSet Wartość |
Windows | .NET Core 2.2 i starsze wersje w systemie Unix | .NET Core 3.0 i nowsze oraz mono w systemie Unix |
---|---|---|---|
Ansi |
char (domyślna wartość systemowa )Strona kodowa systemu 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) |
Upewnij się, że wiesz, jakiej reprezentacji oczekuje reprezentacja natywna podczas wybierania zestawu znaków.