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

.net Marshal.SizeOf()无法计算包含字符串的对象的大小,.net,vb.net,marshalling,unmanaged,.net,Vb.net,Marshalling,Unmanaged,当尝试计算MyClass类型的对象的长度时,Marshal.SizeOf()将引发异常 下面是课堂: <StructLayout(LayoutKind.Sequential, Pack:=1)> Public Class MyClass Public ReadOnly UniqueId As Long <MarshalAs(UnmanagedType.AnsiBStr, SizeConst:=60, SizeParamIndex:=0)> Pu

当尝试计算MyClass类型的对象的长度时,Marshal.SizeOf()将引发异常

下面是课堂:

<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
它将抛出异常“无法计算有意义的大小或偏移”


我怎样才能得到我的物体的长度呢?

我想帮你。Marshall用于值类型例如:struct引用类型,不需要计算其中未使用的对象。你需要使用ex:struct来实现它的功能。我给出了一个代码示例,但很抱歉我是用C编写的#


希望有帮助。有关更多信息,请转到此处

我认为
非托管类型.AnsiBStr
只能用于方法签名的参数(传递的值)

对BSTR的引用是指向长度前缀字符数组的指针。因此,它将是一个.Net Intptr,大小为4或8字节,具体取决于进程位(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

公共类[我的类]
公共只读唯一ID,只要
作为字符串的公共只读名称
末级
建议阅读:


您使用的是什么平台该问题似乎与AnsiBStr有关
BStr
/
LPStr
/
LPWStr
似乎很好,我正在编译x64 Windows中的任何CPU。AnsiBStr不能存储在类或结构成员中。它始终是一个8位字符的可变长度数组,数组中的第一个字节表示后面有多少个字符。因此,SizeConst和SizeParamIndex都不能应用。它仅在函数参数上可用。该声明是否接近所需的非常可疑,我们无法看到本机声明,但您可以通过使用UnmanagedType.ByValTStr将长度前缀声明为Byte,将其余声明为Char()来破解它。
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;
}
<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