Một tuyến đường sẽ được xác định một giao diện COM trong .NET:
<System.Runtime.InteropServices.GuidAttribute("0896D946-8A8B-4E7D-9D0D-BB29A52B5D08"), _
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IEventHandler
Sub OnEvent(ByRef sender As Object, ByRef e As Object)
End Interface
Thực hiện giao diện này trong VB6
Implements MyInterop.IEventHandler
Private Sub IEventHandler_OnEvent(ByRef sender As Variant, ByRef e As Variant)
Dim id
id = e.Entity.Id
' As long as e is COM Visible (not necessarily COM registered, this will work)
End Sub
và sau đó có một Đăng ký trong .NET với một bộ sưu tập tĩnh của IEventHandlers :
<ComClass(ComRegistrar.ClassId, ComRegistrar.InterfaceId, ComRegistrar.EventsId>
Public Class ComRegistrar
Private Shared ReadOnly _eventHandlers As New Dictionary(Of String, List(Of IEventHandler))
' This is called by .NET code to fire events to VB6
Public Shared Sub FireEvent(ByVal eventName As String, ByVal sender As Object, ByVal e As Object)
For Each eventHandler In _eventHandlers(eventName)
eventHandler.OnEvent(sender, e)
Next
End Sub
Public Sub RegisterHandler(ByVal eventName As String, ByVal handler As IEventHandler)
Dim handlers as List(Of IEventHandler)
If Not _eventHandlers.TryGetValue(eventName, handlers)
handlers = New List(Of IEventHandler)
_eventHandlers(eventName) = handlers
End If
handlers.Add(handler)
End Sub
End Class
Mã .NET của bạn sẽ gọi FireEvent và nếu VB6 trước đây gọi là Regi sterHandler, trình duyệt IE6 của bạn sẽ được gọi.
Đây không phải là một ranh giới quy trình ... nó là quá trình tương tự. Vâng, đó là một nỗi đau, nhưng nó có thể hoạt động. – Jeff