Marshaller Struct包含SafeHandle类型的字段

时间:2018-01-11 21:53:56

标签: c# pinvoke marshalling unmanaged

我有一个返回资源的本机函数的P / Invoke函数签名。为了避免内存泄漏,我决定让P / Invoke函数签名返回SafeHandle的子类,让marshaller发挥其魔力:

internal static extern MySafeHandle CreateContext();

但是,我有另一个P / Invoke函数签名,它采用一个结构数组,其中一个字段应该表示一个指向上述函数创建的句柄的指针:

[StructLayout(LayoutKind.Sequential)]
internal struct NativePollerItem {
    internal MySafeHandle Resource;

    internal short RequestedEvents;

    internal short DetectedEvents;
}

internal static extern int Poll(IntPtr pItems, int itemSize)
当我尝试将此结构用于此结构时,

Marshal.StructureToPtr会抛出异常:“System.InvalidOperationException - >此操作中不允许包含SafeHandle字段的结构”

因为Poll函数的性质要在同一个可变参考上非常频繁地调用,所以无论如何我都想避免使用Marshal.StructureToPtr,但我无法使用{{1我也不能在不安全的上下文中创建指向它的指针来传递它们。

我认为我唯一能做的就是将GCHandle的定义从NativePollerItem.Resource更改为NativePollerItem.Resource:MySafeHandle

这需要我再调用NativePollerItem.Resource:IntPtr,因为很多原因不推荐使用SafeHandle.DangerousGetHandle(),但看起来我没有选择。

我的问题:用于解决我在此描述的场景的最佳,最安全的模式是什么。我在.NETStandard 2.0上,以防它与.NET Framework 4.X之间存在差异。非常感谢!

0 个答案:

没有答案