Znakové sady a maršálování

Poznámka:

Následující pokyny jsou určené k [DllImport] použití a je třeba je dodržovat ručně pro správné výsledky. Uživatelé .NET 7 a novější by měli zvážit použití [LibraryImport] . Vestavěný analyzátor Roslyn (povolený ve výchozím nastavení) poskytne požadované pokyny pro [LibraryImport] atribut ve vašem kódu.

Způsob, jakým char jsou hodnoty, string objekty a System.Text.StringBuilder objekty zařazovány, závisí na hodnotě CharSet pole na P/Invoke nebo struktuře. P/Invoke můžete nastavit CharSet nastavením DllImportAttribute.CharSet pole při deklarování P/Invoke. Chcete-li nastavit CharSet pro typ, nastavte pole StructLayoutAttribute.CharSet ve své deklaraci třídy nebo struktury. Pokud tato pole atributů nejsou nastavena, je na kompilátoru jazyka, který určí, který CharSet použít. Jazyk C#, Visual Basic a F# ve výchozím nastavení používají None znakovou sadu, která má stejné chování jako Ansi znaková sada.

Pokud je použit System.Runtime.InteropServices.DefaultCharSetAttribute v modulu v kódu jazyka C# nebo Visual Basic, kompilátor jazyka C# nebo Visual Basic vygeneruje ve výchozím nastavení poskytnuté CharSet místo použití CharSet.None. Jazyk F# nepodporuje DefaultCharSetAttribute, a CharSet.None je ve výchozím nastavení vždy generován.

Následující tabulka ukazuje mapování mezi jednotlivými znakovými sadami a způsob, jakým je znak nebo řetězec reprezentován při zařazování pomocí této znakové sady:

CharSet hodnota Windows .NET Core 2.2 a starší v unixu .NET Core 3.0 a novější a Mono v unixu
Ansi char(výchozí znaková stránka systému 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)

Při výběru znakové sady se ujistěte, že víte, jakou reprezentaci vaše nativní reprezentace očekává.