2017-12-02 121 views
0

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的长度?

+0

什么平台你正在使用 – Adrian

+0

这个问题似乎与'AnsiBStr'。 'BStr' /'LPStr' /'LPWStr'似乎很好https://stackoverflow.com/questions/64714​​21/marshal-c-char-in-c-sharp – Slai

+0

我正在编译到x64 Windows中的AnyCPU。 –

回答

0

我相信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 

推荐阅读:

-1

即时通讯设法帮助。马歇尔用于值类型例如:结构类别引用类型这是不需要计算内部未使用的对象。你需要使用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

相关问题