Welcome to my article. Today I will demonstrate what delegates are and how to use them to call managed code and unmanaged code.
Managed Code Versus Unmanaged Code
In short: managed code is code that is written in the .NET Framework with C# or VB.NET for example. Unmanaged code is code written in any language that is not .NET. This is most commonly languages such as C or C++ as they are known as low level languages that can call the Operating System’s methods directly. Have a look at Managed code and unmanaged code in .NET, which explains this difference better. This brings me to my next topic: API
Have a look Wikipedia’s Application programming interface for a detailed explanation of APIs
A delegate is simply a type that represents a reference to physical methods with the same parameter list and return type. OK, what does that mean in simple terms? A delegate is basically a substitute for a method with the same return type and with the same signature. We make use of a delegate when we cannot access certain threads directly (as explained in this article), or when we need to ensure that managed and unmanaged code can be executed properly.
Add the Function to handle the Unmanaged code’s execution:
'Function To CAll APIs Public Function DisplayRunningApps(ByVal hWnd As IntPtr, ByVal lParam As Int32) As Boolean Dim sbStrings As New StringBuilder(BufferSize) 'To Host App Names If GetWindowText(hWnd, sbStrings, BufferSize) <> 0 Then 'Get Text Of Open Window lstDelegates.Items.Add(sbStrings.ToString()) 'Add To ListBox End If Return True End Function
The DisplayRunningApps function displays the captions of all active windows and adds each to a StringBuilder object, which ultimately gets added to the ListBox. Add the following code behind the button labelled “Unmanaged Delegate“:
Private Sub btnUnmanaged_Click( sender As Object, e As EventArgs) Handles btnUnmanaged.Click ' Unmanaged Code From API EnumWindows(AddressOf DisplayRunningApps, 0) End Sub
Voila! You have now successfully called unmanaged code through a delegate.
Add a class inside Form 1 and give it a method to be called from Form 1:
Public Class ClassForStringSubDelegate Public Sub ShowMessage(ByVal strTemp As String) MessageBox.Show(strTemp ) 'Show MessageBox End Sub End Class
This small example will just show how to use a delegate to call managed code from a separate class. Now, add the following code inside the button labelled “Managed Delegate“:
Private Sub btnManaged_Click( sender As Object, e As EventArgs) Handles btnManaged.Click 'Managed Dim clsStringDelegate As New ClassForStringSubDelegate 'Create Instance Of Separate Class Dim delManaged As StringSubDelegate 'Specify Delegate delManaged = AddressOf clsStringDelegate.ShowMessage 'Give It Something To Do delManaged.Invoke("Hello") 'Do It End Sub
Here, I instantiate the class we created above, and make use of the Invoke method of our delegate to execute the appropriate code. This code simply produces a MessageBox that says ‘Hello‘.
Short and sweet. I hope that you have benefited from this article and that you will put your knowledge of delegates to good use. Until next time, cheers!