備註
下列指引適用於 [DllImport] 使用,必須手動遵循才能取得正確的結果。 .NET 7+ 使用者應該考慮改用 [LibraryImport] 。 內建的 Roslyn 分析器(預設為啟用)將為程式碼中的 [LibraryImport] 屬性提供必要的指引。
char 值、string 物件和 System.Text.StringBuilder 物件的封送處理方式取決於 P/Invoke 或結構中的 CharSet 欄位值。 您可以透過在宣告 P/Invoke 時設定 CharSet 欄位,來設定 P/Invoke 的 DllImportAttribute.CharSet。 若要設定 CharSet 類型的欄位,請在類別或結構宣告上設定 StructLayoutAttribute.CharSet 欄位。 如果未設定這些屬性欄位,則由語言編譯程式決定要使用哪一個 CharSet 。 C#、Visual Basic 和 F# 預設會使用 None charset,其行為與 Ansi charset 相同。
System.Runtime.InteropServices.DefaultCharSetAttribute如果在 C# 或 Visual Basic 程式代碼的模組上套用 ,則 C# 或 Visual Basic 編譯程式預設會發出提供的 CharSet ,而不是使用 CharSet.None。 F# 不支援 DefaultCharSetAttribute,而且預設一律會 CharSet.None 發出。
下表顯示每個字元集之間的對應,以及以該字元集封送處理時,字元或字串的表示方式:
CharSet 值 |
窗戶 | 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) |
請確定您在挑選字元集時,知道原生表示法預期的表示法。