我有一个使用COM对象的vb6应用程序(COM暴露的C#对象)。 vb6应用程序正在订阅COM(C#)对象发布的事件。
我的问题是我不知道如何以编程方式取消订阅该事件。我知道如何取消编写的唯一方法是首先不订阅(即在vb6代码中注释掉事件处理程序)。
有没有办法在运行时(以编程方式)取消订阅?也许通过识别与vb6事件处理程序对应的委托并且不调用它来在C#端做某事?
提前致谢。
答案 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在事件级别上具有更多的粒度。