以编程方式取消订阅活动

时间:2012-09-03 12:25:22

标签: c# vb6 com-interop

我有一个使用COM对象的vb6应用程序(COM暴露的C#对象)。 vb6应用程序正在订阅COM(C#)对象发布的事件。

我的问题是我不知道如何以编程方式取消订阅该事件。我知道如何取消编写的唯一方法是首先不订阅(即在vb6代码中注释掉事件处理程序)。

有没有办法在运行时(以编程方式)取消订阅?也许通过识别与vb6事件处理程序对应的委托并且不调用它来在C#端做某事?

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以通过保留两个对象引用变量来停止在VB6中接收事件,一个变量带有WithEvents关键字,另一个带有Nothing关键字。如果要订阅,请将第一个设置为与第二个相同的对象,要取消订阅,请将第一个设置为Dim MyObject As MyClass Dim WithEvents MyObjectEvents As MyClass Public Sub MyObjectEvents_EventName() MsgBox "Received event" End Sub Private Sub Subscribe() Set MyObjectEvents = MyObject End Sub Private Sub Unsubscribe() Set MyObjectEvents = Nothing End Sub 。当您想要释放对象时,需要确保释放/替换它们。

{{1}}

答案 1 :(得分:2)

允许您拥有更多控制权的另一个选项是回调接口。

您在.NET库中公开了一个具有单EventXYZ方法的接口。 您的VB6类(和其他侦听器)可以实现此接口并将对象的引用传递给.NET类,以便它可以引发该方法。

这与COM和.NET事件使用internall的方法基本相同,但.NET在事件级别上具有更多的粒度。