相关疑难解决方法(0)

是否可以拦截(或意识到)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的答案,埃里克,谁用一个非常简单的解决方案ATL上来.

然而,接受的答案是Bigtoe,他建议将.net对象包装在VbScript对象中(我认为不诚实),有效地为VbScript问题提供了一个简单的VbScript解决方案.

谢谢大家.

.net c# reference-counting com-interop

17
推荐指数
2
解决办法
5130
查看次数

标签 统计

.net ×1

c# ×1

com-interop ×1

reference-counting ×1