5

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

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

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

提前致谢。

4

2 回答 2

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
于 2012-09-03T12:43:39.970 回答
2

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

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

这与 COM 和 .NET 事件在内部使用的方法基本相同,但 .NET 对事件级别的粒度更细。

于 2012-09-03T13:10:52.577 回答