Search code examples
vb.neteventsevent-handlingmulti-project

Events in a VB.Net multi-project solution


Is it possible, to raise a global event in a multiproject solution in VB.Net. For example, project 1 has a form called Form1. On Form1 there is a button, that when clicked, raises an event, where project2 can handle that event, and even project3 could handle that event.


Solution

  • You can have a dedicated Project that has a Class whose sole purpose is to house a "Global Event". Make that Class implement the Singleton Pattern so that all the projects will access the same instance. All the other projects can Reference this Project and could look like this:

    ' This is in Project3
    Public Class Class1
    
        Private Sub New()
        End Sub
    
        Private Shared _Instance As Class1
    
        Public Event GlobalEvent()
    
        Public Shared ReadOnly Property Instance As Class1
            Get
                If IsNothing(_Instance) Then
                    _Instance = New Class1
                End If
                Return _Instance
            End Get
        End Property
    
        Public Sub RingTheBell()
            RaiseEvent GlobalEvent()
        End Sub
    
    End Class
    

    Here is FormA in Project1, displaying FormB in Project2 (Project1 has a reference to both Project2 and Project3). We grab the singleton instance and call the RingTheBell() method to raise the "Global Event":

    ' This is in Project1
    Public Class FormA
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim frmB As New Project2.FormB
            frmB.Show()
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Project3.Class1.Instance.RingTheBell()
        End Sub
    
    End Class
    

    Finally, over in Project2, we also grab the singleton instance and subscribe to its GlobalEvent (Project2 only has a reference to Project3):

    ' This is in Project2
    Public Class FormB
    
        Private WithEvents x As Project3.Class1 = Project3.Class1.Instance
    
        Private Sub x_GlobalEvent() Handles x.GlobalEvent
            MessageBox.Show("GlobalEvent() trapped in Project2")
        End Sub
    
    End Class
    

    So any Project that wants to subscribe to the "Global Event" simply adds a Reference to Project3 and uses the Instance() method which returns the singleton instance to which that Project can subscribe to the event with.