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 用于 值类型 例如:struct。 Class是引用类型,不需要计算其中未使用的对象。你需要使用 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
推荐阅读:
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 用于 值类型 例如:struct。 Class是引用类型,不需要计算其中未使用的对象。你需要使用 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
推荐阅读: