DangerousAddRef是否保持整个SafeHandle活着或只是处理?

时间:2013-06-22 08:42:26

标签: c# unmanaged handle cer

我的情况是我有一个包含HGLOBAL和List< Delegate>的c#对象。 HGLOBAL保存对委托的引用,HGLOBAL在非托管代码中注册为回调(具体来说,是一个vtbl样式的接口)。

我试图不要陷入整体设计的细节(我已经期待那些了解我在前一段中所做的事情的人会尖叫)。我的问题是目前使用我希望以不同方式记录的功能的终身管理之一。

我已经转换了持有HGLOBAL和List< Delegate>的类。进入SafeHandle的子类(因为CriticalFinalizerObject,因为HGLOBAL有点像句柄),我确实有一个类使用CER-style atomic transactions实例化它,以便在非托管代码停止期望它继续存在时通知C#。

调用DangerousAddRef会有效提升整个SafeHandle对象的引用计数吗?列表< Delegate>是否包含在此引用计数中?问这个问题的另一种方法是DangerousAddRef是否有效地为整个SafeHandle对象构建GCHandle,或者它是否只是对内部的SafeHandle.handle成员这样做了吗?

如果它不是作为一个整体应用于对象,那么List< Delegate>可能会提前收集,并在非托管代码尝试调用时导致访问冲突。

如果它作为一个整体应用于对象,那么我刚刚在垃圾收集堆中创建了一个引用计数对象块I had better be darned sure that I haven't created any reference loops

我怀疑它是后者,但谷歌搜索这类东西的次数非常少,当你处理的唯一症状是当没有运行实际的托管代码时进程关闭时终结器线程的非托管访问冲突然后开始很难看出你是否正朝着正确的方向前进。

0 个答案:

没有答案