共用方式為


字元集和封送處理

注意

下列指導適用於 [DllImport] 使用,且必須手動遵循才能取得正確的結果。 .NET 7+ 使用者應該考慮改用 [LibraryImport]。 現用的 Roslyn 分析器 (預設啟用) 將提供您的程式碼中 [LibraryImport] 屬性的必要指引。

char 值、string 物件與 System.Text.StringBuilder 物件的封送處理方式取決於 P/Invoke 或結構上之 CharSet 欄位的值。 您可以透過在宣告您的 P/Invoke 時設定 DllImportAttribute.CharSet 欄位,以設定 P/Invoke 的 CharSet。 若要為類型設定 CharSet,請在您的類別或結構宣告上設定 StructLayoutAttribute.CharSet 欄位。 當這些屬性欄位未設定時,語言編譯器可決定要使用的 CharSet。 根據預設,C#、Visual Basic 和 F# 會使用 None 字元集,其行為與 Ansi 字元集相同。

如果在 C# 或 Visual Basic 程式碼的模組上套用 System.Runtime.InteropServices.DefaultCharSetAttribute,則根據預設 C# 或 Visual Basic 編譯器會發出提供的 CharSet,而不是使用 CharSet.None。 F# 不支援 DefaultCharSetAttribute,而且根據預設一律會發出 CharSet.None

下表說明每個字元集與使用該字元集進行封送處理時,如何代表字元集或字串:

CharSet Windows UNIX 上的 .NET Core 2.2 及更早版本 UNIX 上的 .NET Core 3.0、更新版本及 Mono
Ansi char (系統預設 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)

選擇您的字元集時,請確定您知道您原生代表的代表應該是什麼樣子。