小编Eri*_*ler的帖子

当结构包含bool时,如何将GCHandle分配给结构

我一直在尝试创建一个结构类型的句柄,因为我需要一个指向它的固定指针,但我收到错误"对象包含非原始或非blittable数据"

我的结构看起来像这样:

[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
    [MarshalAs(UnmanagedType.U1)]
    public bool Test;
}
Run Code Online (Sandbox Code Playgroud)

现在,当我打电话的时候

var mystruct = new MyStruct();
var handle = GCHandle.Alloc(mystruct, GCHandleType.Pinned);
Run Code Online (Sandbox Code Playgroud)

我收到错误"对象包含非原始或非blittable数据".现在我明白bool字段是一个非blittable类型.但我的印象是,通过添加MarshalAs属性,我可以告诉marshaller如何转换类型.(我也试过UnmanagedType.Bool)

这个结构必须全局定义,因为我的课程需要它.我需要指针的唯一原因是因为我有一个非托管API,必须将此结构作为指针传递.然后我必须在回调和读取/更新成员中获得该结构.

所以这是基本情景.

  1. 结构是在托管类中全局创建的
  2. 获得结构指针
  3. 结构的指针传递给API
  4. API调用静态方法回调,然后我需要获取我的结构并读取/更新成员.

我试图使用,Marshal.StructureToPtr但这只创建一个副本,所以如果在我的托管类中我更新成员,当引发回调时,更新的值不存在.

有谁知道如何获得指向我的结构的固定指针,以便我可以读取/修改公共成员并让它们在回调中可用?

谢谢

c# pinvoke pointers

10
推荐指数
2
解决办法
2031
查看次数

标签 统计

c# ×1

pinvoke ×1

pointers ×1