.net Marshal.SizeOf()无法计算包含字符串的对象的大小
当尝试计算MyClass类型的对象的长度时,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
<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,只要
作为字符串的公共只读名称
末级
建议阅读:
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