我一直在尝试创建一个结构类型的句柄,因为我需要一个钉住指针,但我得到的错误“对象包含非原始的或非原始的, blittable数据“我如何分配GCHandle结构当结构包含布尔
我的结构是这样的:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.U1)]
public bool Test;
}
现在,当我打电话,
var mystruct = new MyStruct();
var handle = GCHandle.Alloc(mystruct, GCHandleType.Pinned);
我得到的错误”对象包含非基本或非blittable数据”。现在我明白了bool字段是一个非blittable类型。但我的印象是,通过添加MarshalAs属性,我可以告诉编组人员如何转换类型。 (我也试过UnmanagedType.Bool
)
这个结构必须在全局范围内定义,因为它在整个班级都是需要的。我需要指针的唯一原因是因为我有一个非托管API,必须将此结构作为指针传递。然后,我必须在回调中获取该结构并读取/更新成员。
所以这是基本情况。
- 结构是
- 指向结构得到
- 指向结构传递到API
- API调用静态方法回调,我则需要获得管理类全球范围内创建我的结构和阅读/更新成员。
我试图用Marshal.StructureToPtr
但这只能创建一个副本,因此,如果在我的管理类我更新的构件时,在回调上升,更新的价值是不存在的。
有谁知道我怎么能得到一个固定的指针,我的结构,所以我可以读/修改公共成员,并让他们在回调中可用?
谢谢
这里是Blittable型列表HTTP:/ /msdn.microsoft.com/en-us/library/75dwhxf7.aspx – Mayank 2014-12-27 20:06:20