Udostępnij za pośrednictwem


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 DefaultCharSetAttributei 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.