字符集和封送

注释

以下指南适用于 [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 字符集,该字符集的行为与 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)

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