Language Basics VB.Net

Imports System
Imports System.Collections
Delegate Sub DelegateWithStringSignature(ByVal S As String)
Delegate Sub DelegateWithNoParam()
public class MainClass
   Shared Sub Main()
        Dim c As New CalledClass()
        Dim o As New OtherCalledClass()
        Dim BadObject As New ObjectWithNoWriteMessage()
        Dim d1 As DelegateWithStringSignature
        Dim Params() As Object = {"DynamicParam"}
        ' The two following lines are identical
        d1 = New DelegateWithStringSignature(AddressOf c.WriteMessage)
        d1.Invoke("Test")
        d1.DynamicInvoke(Params)
        d1 = AddressOf c.WriteMessage
        d1.Invoke("Test")
        d1.DynamicInvoke(Params)
   End Sub
End Class
Class CalledClass
    Shared Sub SharedMessage(ByVal s As String)
        Console.WriteLine("CalledClass.SharedMessage with parameter: " & s)
    End Sub
    Public Sub WriteMessage(ByVal s As String)
        Console.WriteLine("CalledClass WriteMessage method with parameter: " & s)
    End Sub
End Class
Class OtherCalledClass
    Sub WriteMessage(ByVal s As String)
        Console.WriteLine("OtherCalledClass WriteMessage method with parameter: " & s)
    End Sub
End Class
Class ObjectWithNoWriteMessage
    Sub BadWriteMessage()
    End Sub
End Class