Marshal.SizeOf(Type t) function

本文关键字:function Type SizeOf Marshal | 更新日期: 2023-09-27 18:24:48

我知道SizeOf()应该用于与非托管代码交互,但我的问题是为什么System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.Char))返回1而不是2?我假设C# char应该等效于大小为2字节的非托管wchar_t。这会引起问题吗?

Marshal.SizeOf(Type t) function

来自Marshal.SizeOf:

对于字符类型,大小受应用于该类的CharSet值的影响。

根据CharSet枚举,默认值为CharSet.Ansi:

尽管公共语言运行时的默认值是Auto,但语言可能会覆盖此默认值。例如,默认情况下,C#将所有方法和类型标记为Ansi


例如:

[StructLayout(LayoutKind.Sequential)]
struct A
{
    char c;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct B
{
    char c;
}
....
Console.WriteLine("{0} {1}", Marshal.SizeOf(typeof(A)), Marshal.SizeOf(typeof(B)));

输出是

1 2