字符集和封送

注意

以下指导供 [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)

确保了解选择字符集时所需的本机表示形式。