Marshal.SizeOf()无法计算包含字符串的对象的大小
Marshal.SizeOf()将在尝试计算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
该代码将失败:
Dim MyObject = New MyClass() Dim size = Marshal.SizeOf(MyObject) 'will throw exception here. Why?
它会抛出异常“任何有意义的大小或偏移量可以计算”
我怎样才能取而代之的是MyObject的长度?
回答:
我相信UnmanagedType.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
推荐阅读:
- Eric’s complete guide to BSTR semantics
- The Meaning of Marshal.SizeOf()
回答:
即时通讯设法帮助。马歇尔用于值类型例如:结构。 类别是引用类型这是不需要计算内部未使用的对象。你需要使用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
以上是 Marshal.SizeOf()无法计算包含字符串的对象的大小 的全部内容, 来源链接: utcz.com/qa/258503.html