我有一個使用COM對象(COM公開的C#對象)的vb6應用程序。 vb6應用程序正在訂閱由COM(C#)對象發佈的事件。以編程方式取消訂閱事件
我的問題是,我不知道如何以編程方式取消訂閱該事件。我知道如何取消寫入的唯一方法是不首先訂閱(即註釋掉vb6代碼中的事件處理程序)。
有沒有辦法在運行時取消訂閱(以編程方式)?也許通過確定與vb6事件處理程序相對應的委託而不是調用它來在C#端做些什麼?
在此先感謝。
我有一個使用COM對象(COM公開的C#對象)的vb6應用程序。 vb6應用程序正在訂閱由COM(C#)對象發佈的事件。以編程方式取消訂閱事件
我的問題是,我不知道如何以編程方式取消訂閱該事件。我知道如何取消寫入的唯一方法是不首先訂閱(即註釋掉vb6代碼中的事件處理程序)。
有沒有辦法在運行時取消訂閱(以編程方式)?也許通過確定與vb6事件處理程序相對應的委託而不是調用它來在C#端做些什麼?
在此先感謝。
您可以通過保留兩個對象引用變量(一個關鍵字爲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事件使用內部方法的方法相同,但.NET在事件級別上具有更多的粒度。
另外,只需接收事件並立即返回。 – Deanna
這種替代方案(立即返回)對我來說不可行,因爲我試圖擺脫的是原生/管理的轉換,這些轉換給我造成了很大的性能損失。這麼短的另一個想法,我可能會嘗試以上的解決方案。謝謝。 – mnrtyrpt123
你也可以有一個名爲「SendMeEventX」的變量,在提出事件之前檢查。這將影響所有聽衆。 – Deanna