C# 对C API使用“SafeHandle”,包括引用计数
我正在研究Python互操作。在内部,Python通过C# 对C API使用“SafeHandle”,包括引用计数,c#,unmanagedresources,safehandle,C#,Unmanagedresources,Safehandle,我正在研究Python互操作。在内部,Python通过Py_IncRef和Py_DecRef为所有对象保留引用计数器。我希望确保Python对象指针的正确终结,因此我尝试创建一个从SafeHandle派生的类PyHandle,该类将调用Py\u DecRefonReleaseHandle 问题是:与Windows API不同,Python在返回指向对象的指针之前不增加refcount。因此,当interop创建PyHandle的实例时,我希望它在指针上调用Py\u IncRef。然而,我看不到一
Py_IncRef
和Py_DecRef
为所有对象保留引用计数器。我希望确保Python对象指针的正确终结,因此我尝试创建一个从SafeHandle
派生的类PyHandle
,该类将调用Py\u DecRef
onReleaseHandle
问题是:与Windows API不同,Python在返回指向对象的指针之前不增加refcount。因此,当interop创建PyHandle
的实例时,我希望它在指针上调用Py\u IncRef
。然而,我看不到一个方法,我可以覆盖发生这种情况SafeHandle
构造函数接受无效的句柄值,并且没有要重写的AcquireHandle
。CORECRL代码还具有不可重写的SetHandle
方法(请参阅)
当interop构造了PyHandle
时,如何调用Py\u incremf
SafeHandle
是任务的正确工具吗?SafeHandle
没有向其传递句柄的公共方法。因此,在将句柄传递给受保护的基本方法之前,请随意调用Py_incremf
然而,
SafeHandle
对于您来说可能有些过分,因为它维护自己的引用计数器,而对于维护自己引用计数的句柄来说,这并不是真正需要的。AFAIR,我不应该显式地将IntPtr
传递给SafeHandle
。相反,互操作代码应该自动执行(???)。例如,当我定义extern PyHandle PyFunc(…)时代码>内部CLR互操作代码创建PyHandle
实例,并设置其原始指针。