Dela via


Teckenuppsättningar och marshalling

Kommentar

Följande vägledning är avsedd för [DllImport] användning och måste följas manuellt för att få korrekta resultat. .NET 7+ användare bör överväga att använda [LibraryImport] i stället. En inbyggd Roslyn-analysator (aktiverad som standard) ger nödvändig vägledning för [LibraryImport] attributet i koden.

Hur char värden, string objekt och System.Text.StringBuilder objekt ordnas beror på värdet CharSet för fältet på antingen P/Invoke eller -strukturen. Du kan ange CharSet P/Invoke genom att ange DllImportAttribute.CharSet fältet när du deklarerar P/Invoke. CharSet Ange för en typ genom att ange fältet StructLayoutAttribute.CharSet på din klass- eller structdeklaration. När dessa attributfält inte har angetts är det upp till språkkompilatorn att avgöra vilken som CharSet ska användas. C#, Visual Basic och F# använder teckenuppsättningen None som standard, som har samma beteende som teckenuppsättningen Ansi .

System.Runtime.InteropServices.DefaultCharSetAttribute Om används på modulen i C# eller Visual Basic-koden genererar C# eller Visual Basic-kompilatorn den som tillhandahålls CharSet som standard i stället för att använda CharSet.None. F# stöder DefaultCharSetAttributeinte , och genererar CharSet.None alltid som standard.

I följande tabell visas en mappning mellan varje teckenuppsättning och hur ett tecken eller en sträng representeras när den är kopplad till den teckenuppsättningen:

CharSet Värde Windows .NET Core 2.2 och tidigare på Unix .NET Core 3.0 och senare och Mono på Unix
Ansi char (systemets standardvärde Windows-kodsida (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)

Se till att du vet vilken representation din inbyggda representation förväntar sig när du väljer din teckenuppsättning.