我已经改写了这个问题.
当.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与我们集成的客户提供的实用程序和帮助程序函数.
我不想做什么
谢谢
BW
接受的答案
分毫不差一千感谢史蒂夫·施泰纳,谁,唯一的(可能是可行的)想出了基于.NET的答案,埃里克,谁用一个非常简单的解决方案ATL上来.
然而,接受的答案是Bigtoe,他建议将.net对象包装在VbScript对象中(我认为不诚实),有效地为VbScript问题提供了一个简单的VbScript解决方案.
谢谢大家.