C# 对C API使用“SafeHandle”,包括引用计数

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。然而,我看不到一

我正在研究Python互操作。在内部,Python通过
Py_IncRef
Py_DecRef
为所有对象保留引用计数器。我希望确保Python对象指针的正确终结,因此我尝试创建一个从
SafeHandle
派生的类
PyHandle
,该类将调用
Py\u DecRef
on
ReleaseHandle

问题是:与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
实例,并设置其原始指针。