【发布时间】:2015-02-24 13:45:44
【问题描述】:
我一直在尝试创建结构类型的句柄,因为我需要一个指向它的固定指针,但我收到错误消息“对象包含非原始或非 blittable 数据”
我的结构是这样的:
[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 类型的列表msdn.microsoft.com/en-us/library/75dwhxf7.aspx