Marshal.SizeOf() 无法计算包含字符串的对象的大小

Marshal.SizeOf() cannot calculate size of object containing string

Marshal.SizeOf() 在尝试计算 MyClass 类型对象的长度时会抛出异常。

这是 class:

<StructLayout(LayoutKind.Sequential, Pack:=1)>
Public Class MyClass

    Public ReadOnly UniqueId As Long

    <MarshalAs(UnmanagedType.AnsiBStr, SizeConst:=60, SizeParamIndex:=0)>
    Public ReadOnly Name As String

End Class

此代码将失败:

Dim MyObject = New MyClass()
Dim size  = Marshal.SizeOf(MyObject) 'will throw exception here. Why?

会抛出异常"no meaningful size or offset can be computed"

如何获取 MyObject 的长度?

我正在努力提供帮助。 Marshall 用于 值类型 例如:structClass引用类型,不需要计算其中未使用的对象。你需要使用 ex:struct 来完成它的工作。我给出了我的代码示例,但很抱歉我是在 C#

上写的
class Program
{
    static void Main(string[] args)
    {
        TestingData p = new TestingData();
        Console.WriteLine("Number of bytes : {0}", Marshal.SizeOf(p));
    }
}

public struct TestingData
{
    public string a;
}

希望对您有所帮助。欲了解更多信息,请访问此处 Marshal Documentation

我认为UnmanagedType.AnsiBStr只能用于方法签名的参数(传递值)。

对 BSTR 的引用是指向长度前缀字符数组的指针。因此,它将是一个大小为 4 或 8 字节的 .Net Intptr,具体取决于进程位数(x32 或 x64)。如果需要 ANSI 字符,则将其定义为 StructLayout 声明的一部分并将字符串标记为 UnmanagedType.BStr

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Ansi)>
Public Class [MyClass]
     Public ReadOnly UniqueId As Long
    <MarshalAs(UnmanagedType.BStr)>
     Public ReadOnly Name As String
End Class

推荐阅读: