# Get an instance of a form dynamically at runtime

There is sometimes a need for you to be able to dynamically choose a form to load at runtime, in order to achieve this you’re able to use the following code, you will need to ensure that you import System.Reflection in order for this to work.

It is also recommended that you check for the existence of the form in your project prior to trying to get an instance of it, you can do this through the code available in my article Check whether a form exists.

#Region "Exceptions"
Public Class FormNotFoundException
Inherits ApplicationException
Public Sub New(ByVal message As String)
MyBase.New(message)
End Sub
End Class
#End Region
''' <summary>
''' This method deals with returning a Form object of the form that the name was supplier for
''' </summary>
''' <param name="formName">The name of the form that you wish to have returned</param>
''' <returns>The form with the name that was specified</returns>
''' <remarks>You should check whether the form exists using the doesFormExist function</remarks>
Public Shared Function getForm(ByVal formName As String) As Form
Dim myAssembly As Assembly
Dim frm As Form = Nothing
Dim assemblyName As String

Try
myAssembly = Assembly.GetEntryAssembly

assemblyName = myAssembly.FullName.Split(",")(0)
frm = myAssembly.CreateInstance(assemblyName & "." & formName)
Catch exNull As NullReferenceException
Throw New FormNotFoundException("The form name specified does not relate to a valid form. Please note that form names are case sensitive")
Catch ex As Exception
Throw ex
End Try

If frm Is Nothing Then
Throw New FormNotFoundException("The form name specified does not relate to a valid form. Please note that form names are case sensitive")
End If

Return frm
End Function


Please note the reason that we are using Assembly.GetEntryAssembly rather than Assembly.GetExecutingAssembly is that if we was to put our code into a DLL for example, then the executing assembly would be the dll which in most cases wouldn’t contain the forms. Obviously if your forms and the code that gets the form are held in the DLL then you would want to use Assembly.GetExecutingAssembly.