2009-07-28 99 views
4

有人可以请解释下面的参数异常:结构不能是价值类给我。 它是由我在程序的下面的代码行原因:PtrToStructure抛出的异常

Marshal.PtrToStructure(m.LParam, dbh); 

因为dbh的类型是:

[StructLayout(LayoutKind.Sequential)] 
public struct Device_Broadcast_Header 
{ 
    public int dbch_size; 
    public int dbch_devicetype; 
    public int dbch_reserved; 
} 

感谢

回答

6

您不能使用值类型(即struct)调用此特定的Marshal.PtrToStructure过载。

如果你打电话this overload你可以收到你的类型的一个实例。

+0

例如:`dbh =(Device_Broadcast_Header)Marshal.PtrToStructure(m.LParam,typeof(Device_Broadcast_Header));` – Pieniadz 2013-11-05 00:04:04

2

对不起,我不给一个代码示例,但在这里是一个link,可能会帮助你。

这里是从上面的链接的关键文字:

问题不做任何处理的 RegisterTraceGuids API。

根据 Marshal.PtrToStructure(IntPtr的,对象) http://msdn.microsoft.com/en-us/library/30ex8z62.aspx 的文档,它抛出 你看到的,当结构布局不 连续或显式或结构是 装箱值类型的ArgumentException。

在这种情况下,该结构是 声明为顺序的,然而,在阵列中的 元件 (traceGuidReg [I])被装箱,因为该数组 物体在 托管堆上,从而你得到了错误“ 结构不能是值类。”

你将需要使用过载 Marshal.PtrToStructure方法(IntPtr的, 型) http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx 和 累得PtrToStructure的结果分配给该数组的元素。

+0

谢谢雅斯我有点击中解决方案之前,你回答,并且该网站也,但你能解释什么家伙意味着被管理的堆上的元素盒?我想我有一个公平的想法,这可能意味着什么,但我想澄清。 – 2009-07-28 18:51:34

0
[StructLayout(LayoutKind.Sequential)] 
public class Device_Broadcast_Header_Wrapper{ 
    public Device_Broadcast_Header Header 
} 

Device_Broadcast_Header_Wrapper wapper = new Device_Broadcast_Header_Wrapper(); 
Marshal.PtrToStructure(m.LParam, wapper); 
+0

仅仅回答代码只是因为它们不会为将来的读者提供很多信息,请提供一些解释给你写的内容 – WhatsThePoint 2017-10-03 07:32:16