有人可以解释下面的参数例外:结构不能是价值类。 它是由我的程序中的以下代码行引起的:
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;
}
由于
答案 0 :(得分:6)
您无法使用值类型(即struct
)调用此特定Marshal.PtrToStructure
重载。
如果您致电this overload,您可以收到您的类型实例。
答案 1 :(得分:2)
很抱歉没有提供代码示例,但这里有link可能对您有帮助。
以下是上述链接的主要文字:
问题与此无关 RegisterTraceGuids API。
根据医生的说法 Marshal.PtrToStructure(IntPtr,Object) http://msdn.microsoft.com/en-us/library/30ex8z62.aspx ,它会抛出ArgumentException 你看到的结构布局不是 顺序或显式或结构是 盒装值类型。
在这种情况下,结构是 然而,声明为顺序 数组中的元素 (traceGuidReg [i])装在盒子上 托管堆由于数组 对象,因此你得到错误“ 结构不能是价值类。“
您需要使用重载 Marshal.PtrToStructure Method(IntPtr, 类型) http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx 并分配结果 PtrToStructure到数组元素。
答案 2 :(得分: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);