C# 以编程方式取消订阅事件

C# 以编程方式取消订阅事件,c#,vb6,com-interop,C#,Vb6,Com Interop,我有一个vb6应用程序,它使用COM对象(COM公开的C#对象)。vb6应用程序正在订阅COM(C#)对象发布的事件 我的问题是,我不知道如何以编程方式取消订阅该活动。我知道如何取消订阅的唯一方法是首先不订阅(即在vb6代码中注释掉事件处理程序) 有没有办法在运行时取消订阅(以编程方式)?也许在C端做点什么,识别与vb6事件处理程序相对应的委托,而不调用它 提前感谢。通过保留两个对象引用变量,一个带有WithEvents关键字,另一个不带关键字,可以停止在VB6中接收事件。如果要订阅,请将第一个

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

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

有没有办法在运行时取消订阅(以编程方式)?也许在C端做点什么,识别与vb6事件处理程序相对应的委托,而不调用它


提前感谢。

通过保留两个对象引用变量,一个带有
WithEvents
关键字,另一个不带关键字,可以停止在VB6中接收事件。如果要订阅,请将第一个对象设置为与第二个对象相同的对象;如果要取消订阅,请将第一个对象设置为
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事件使用internall的方法基本相同,但.NET在事件级别具有更高的粒度。

或者,只接收事件并立即返回。此替代方法(立即返回)这对我来说是不可行的,因为我试图摆脱的是本机/管理的转换,这会给我带来很多悲伤。如果没有其他想法,我可能会尝试上面的解决方案。谢谢。您还可以有一个名为“SendMeEventX”的变量,在引发事件之前进行检查。但这会影响所有侦听器。在C端,我可以通过调用事件上的GetInvocationList来获取在引发事件时将调用的委托列表。如果我能够识别与vb6应用程序订阅相对应的代理,那么我就不能在调用其他代理的同时调用该特定代理。