5

有人可以解释以下参数异常:结构对我来说不能是价值类。这是由我的程序中的以下代码行引起的:

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;
}

谢谢

4

3 回答 3

7

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

如果您调用此重载,您可以收到您的类型的实例。

于 2009-07-28T18:02:40.630 回答
2

很抱歉没有给出代码示例,但这里有一个可能对您有所帮助的链接。

以下是上述链接中的关键文本:

该问题与 RegisterTraceGuids API 无关。

根据 Marshal.PtrToStructure(IntPtr, Object) http://msdn.microsoft.com/en-us/library/30ex8z62.aspx的文档, 当结构布局不是顺序或显式或结构时,它会抛出您看到的 ArgumentException是一个装箱的值类型。

在这种情况下,结构被声明为顺序结构,但是,由于数组对象,数组 (traceGuidReg[i]) 中的元素被装箱在托管堆上,因此您收到错误“结构不能是值类。”

您需要使用重载 Marshal.PtrToStructure Method (IntPtr, Type) http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx 并将 PtrToStructure 的结果分配给数组元素。

于 2009-07-28T18:00:49.683 回答
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);
于 2017-10-03T06:57:15.470 回答