我有一个返回资源的本机函数的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之间存在差异。非常感谢!