Tag: reference counting

是否可以拦截(或意识到)COM引用计数暴露给COM的CLR对象

我已经改写了这个问题。 当.net对象通过COM iterop公开给COM客户端时,会创建一个CCW( COM Callable Wrapper ),它位于COM客户端和Managed .net对象之间。 在COM世界中,对象保留其他对象对其的引用数量的计数。 当引用计数变为零时,将删除/释放/收集对象。 这意味着COM对象终止是确定性的(我们在.net中使用Using / IDispose进行确定性终止,对象终结器是非确定性的)。 每个CCW都是一个COM对象,它的引用计数与任何其他COM对象一样。 当CCW死亡(引用计数变为零)时,GC将无法找到CCW包装的CLR对象,并且CLR对象有资格进行收集。 快乐的日子,一切都与世隔绝。 我想要做的是在CCW死亡时(即当它的引用计数变为零时)捕获,并以某种方式将此信号通知给CLR对象(例如,通过在托管对象上调用Dispose方法)。 那么,是否可以知道CLR类的COM可调用包装器的引用计数何时变为零? 和/或 是否有可能在.net中为CCW提供AddRef和ReleaseRef的实现? 如果不是替代方法是在ATL中实现这些DLL(我不需要任何ATL帮助,谢谢)。 它不是火箭科学,但我不愿意这样做,因为我是内部唯一的开发人员,任何现实世界的C ++或任何ATL。 背景 我在.net中重写了一些旧的VB6 ActiveX DLL(确切地说是C#,但这更像是.net / COM互操作问题,而不是C#问题)。 一些旧的VB6对象依赖于引用计数来在对象终止时执行操作(参见上面引用计数的解释)。 这些DLL不包含重要的业务逻辑,它们是我们为使用VBScript与我们集成的客户提供的实用程序和帮助程序函数。 我不想做什么 引用计数.net对象而不是使用垃圾收集器。 我对GC很满意,我的问题不在于GC。 使用对象终结器。 终结器是非确定性的,在这种情况下我需要确定性终止(如.net中的Using / IDispose惯用法) 在非托管C ++中实现IUnknown 如果我要使用C ++路由,我将使用ATL,谢谢。 使用Vb6解决此问题,或重新使用VB6对象。 本练习的全部内容是消除我们对Vb6的构建依赖性。 谢谢 BW 接受的答案 感谢史蒂夫施泰纳 ,他提出了唯一(可能可行的)基于.net的答案,以及Earwicker ,他提出了一个非常简单的ATL解决方案。 然而,接受的答案是Bigtoe ,他建议将.net对象包装在VbScript对象中(我认为不诚实),有效地为VbScript问题提供了一个简单的VbScript解决方案。 谢谢大家。