我有一个使用 COM 对象(COM 暴露的 C# 对象)的 vb6 应用程序。vb6 应用程序正在订阅由 COM (C#) 对象发布的事件。
我的问题是我不知道如何以编程方式取消订阅该事件。我知道如何取消订阅的唯一方法是首先不订阅(即注释掉 vb6 代码中的事件处理程序)。
有没有办法在运行时(以编程方式)取消订阅?也许通过识别与 vb6 事件处理程序对应的委托而不调用它来在 C# 端做一些事情?
提前致谢。
我有一个使用 COM 对象(COM 暴露的 C# 对象)的 vb6 应用程序。vb6 应用程序正在订阅由 COM (C#) 对象发布的事件。
我的问题是我不知道如何以编程方式取消订阅该事件。我知道如何取消订阅的唯一方法是首先不订阅(即注释掉 vb6 代码中的事件处理程序)。
有没有办法在运行时(以编程方式)取消订阅?也许通过识别与 vb6 事件处理程序对应的委托而不调用它来在 C# 端做一些事情?
提前致谢。
您可以通过保留两个对象引用变量来停止在 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
允许您拥有更多控制权的另一个选项是回调接口。
您在 .NET 库中公开了一个具有单一EventXYZ
方法的接口。您的 VB6 类(和其他侦听器)可以实现此接口并将对该对象的引用传递给您的 .NET 类,以便它引发方法。
这与 COM 和 .NET 事件在内部使用的方法基本相同,但 .NET 对事件级别的粒度更细。