字元集和封送處理
注意
下列指導適用於 [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) |
選擇您的字元集時,請確定您知道您原生代表的代表應該是什麼樣子。