Visual Basic .NET Tutorial

Here is the code. I will explain later.
'Import dlls
Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Reflection
'wrap your code in a namespace so functions aren't confused
Namespace FreeVB
'create a startup form
Public Class frmMain
	Inherits Form
	'declare controls used on form
	Private WithEvents rtbCode As New RichTextBox
	Private rtbResults As New RichTextBox
	Private mnuMain as New MainMenu()
	Private mnuFile as New MenuItem()
	Private WithEvents mnuFileNew as New MenuItem()
	Private WithEvents mnuFileOpen as New MenuItem()
	Private WithEvents mnuFileSave as New MenuItem()
	Private WithEvents mnuFileSaveAs as New MenuItem()
	Private WithEvents mnuFilePrint as New MenuItem()
	Private mnuFileHyph1 as New MenuItem()
	Private WithEvents mnuFileExit as New MenuItem()
	Private mnuEdit as New MenuItem()
	Private WithEvents mnuEditSelectAll as New MenuItem()
	Private WithEvents mnuEditFind as New MenuItem()
	Private WithEvents mnuColorCode as New MenuItem()
	Private mnuCompilation as New MenuItem()
	Private WithEvents mnuCompile as New MenuItem()
	Private WithEvents mnuCompileAndRun as New MenuItem()
	Private WithEvents mnuCompileCancel as New MenuItem()
	Private mnuOptions as New MenuItem()
	Private WithEvents mnuOptDebug as New MenuItem()
	Private WithEvents mnuOptRelease as New MenuItem()
	Private WithEvents mnuOptHyph1 as New MenuItem()
	Private WithEvents mnuOptConsole as New MenuItem()
	Private WithEvents mnuOptWinExe as New MenuItem()
	Private WithEvents mnuOptWinDll as New MenuItem()
	Private mnuHelp as New MenuItem()
	Private WithEvents mnuHelpAssy as New MenuItem()
	Private WithEvents mnuHelpClass as New MenuItem()
	'declare variables and constants
	Private sFileName as String
	Private sPath as String
	Private mbCompiling as Boolean
	Private Const MAXKEYWORD = 59
	Private aKey(MAXKEYWORD) As String
	Private Const TMPLOCFILE = "\tmpvbnet.loc"
	Private Const TMPERRFILE = "\tmpvbnet.err"
	Private Const TMPVBFILE = "\tmpvbnet.vb"
	Private Const TMPBATFILE = "\tmpvbnet.bat"
	Private Const NOERROR = "All rights reserved." & vbLf & vbLf
	'Form Launch Point
	 Shared Sub Main()
		System.Windows.Forms.Application.Run(New frmMain())
	End Sub
	Public Sub New()
		MyBase.New
		'Form Properties
		Me.Height=600
		Me.Width=800
		Me.Left=0
		Me.Top=0
		Me.Text="FreeVB"
		'Control Properties
		rtbCode.Height=Me.Height - 140
		rtbCode.Width=Me.Width-10
		rtbCode.Left=0
		rtbCode.Top=0
		rtbCode.Multiline=true
		rtbCode.ScrollBars=ScrollBars.Both
		rtbCode.Text = "code here"
		rtbCode.AcceptsTab = True
		rtbResults.Height=100
		rtbResults.Width=Me.Width-10
		rtbResults.Left=0
		rtbResults.Top=rtbCode.Height
		rtbResults.Multiline=true
		rtbResults.ScrollBars=ScrollBars.Both
		rtbResults.Text="compiler ouput"
		mnuFile.Text="&File"
		mnuFileNew.Text="&New"
		mnuFileOpen.Text="&Open"
		mnuFileSave.Text="&Save"
		mnuFileSaveAs.Text="Save &As..."
		mnuFilePrint.Text="&Print"
		mnuFileHyph1.Text="-"
		mnuFileExit.Text="E&xit"
		mnuEdit.Text="&Edit"
		mnuEditSelectAll.Text="Select &All"
		mnuEditFind.Text="&Find"
		mnuColorCode.Text="&Color Code"
		mnuCompilation.Text="&Compilation"
		mnuCompile.Text="&Compile"
		mnuCompileAndRun.Text="Compile and &Run"
		mnuCompileCancel.Text="C&ancel"
		mnuOptions.Text="&Options"
		mnuOptDebug.Text="&Debug"
		mnuOptRelease.Text="&Release"
		mnuOptHyph1.Text="-"
		mnuOptConsole.Text="&Console"
		mnuOptWinExe.Text="Win &Exe"
		mnuOptWinDll.Text="Win &Dll"
		mnuHelp.Text="&Help"
		mnuHelpAssy.Text="&Assembly Help"
		mnuHelpClass.Text="&Class Help"
		'Create you menu hierarchy
		mnuMain.MenuItems.Add(mnuFile)
		mnuFile.MenuItems.Add(mnuFileNew)
		mnuFile.MenuItems.Add(mnuFileOpen)
		mnuFile.MenuItems.Add(mnuFileSave)
		mnuFile.MenuItems.Add(mnuFileSaveAs)
		mnuFile.MenuItems.Add(mnuFilePrint)
		mnuFile.MenuItems.Add(mnuFileHyph1)
		mnuFile.MenuItems.Add(mnuFileExit)
		mnuMain.MenuItems.Add(mnuEdit)
		mnuEdit.MenuItems.Add(mnuEditSelectAll)
		mnuEdit.MenuItems.Add(mnuEditFind)
		mnuEdit.MenuItems.Add(mnuColorCode)
		mnuMain.MenuItems.Add(mnuCompilation)
		mnuCompilation.MenuItems.Add(mnuCompile)
		mnuCompilation.MenuItems.Add(mnuCompileAndRun)
		mnuCompilation.MenuItems.Add(mnuCompileCancel)
		mnuMain.MenuItems.Add(mnuOptions)
		mnuOptions.MenuItems.Add(mnuOptDebug)
		mnuOptions.MenuItems.Add(mnuOptRelease)
		mnuOptions.MenuItems.Add(mnuOptHyph1)
		mnuOptions.MenuItems.Add(mnuOptConsole)
		mnuOptions.MenuItems.Add(mnuOptWinExe)
		mnuOptions.MenuItems.Add(mnuOptWinDll)
		mnuMain.MenuItems.Add(mnuHelp)
		mnuHelp.MenuItems.Add(mnuHelpAssy)
		mnuHelp.MenuItems.Add(mnuHelpClass)
		'add controls to the form
		Me.Controls.Add(rtbCode)
		Me.Controls.Add(rtbResults)
		Me.Menu = mnuMain
		'form setup code
		sFileName="untitled.vb"
		sPath=System.Windows.Forms.Application.StartupPath
		Me.Text="FreeVBIDE: " & sFileName
		rtbCode.Text=""
		mnuOptDebug.Checked=True
		mnuOptWinExe.Checked=True
		FillKeyWords
	End Sub
	'create a list of keywords for color coding
	Public Sub FillKeyWords()
		aKey(0) = "Imports"
		aKey(1) = "Namespace"
		aKey(2) = "Public"
		aKey(3) = "Private"
		aKey(4) = "Class"
		aKey(5) = "Inherits"
		aKey(6) = "As"
		aKey(7) = "New"
		aKey(8) = "Shared"
		aKey(9) = "End"
 		aKey(10) = "Sub"
		aKey(11) = "Function"
		aKey(12) = "Me"
		aKey(13) = "Protected"
		aKey(14) = "Overloads"
		aKey(15) = "Overrides"
		aKey(16) = "Try"
		aKey(17) = "Catch"
		aKey(18) = "MyBase"
		aKey(19) = "True"
		aKey(20) = "False"
		aKey(21) = "Dim"
		aKey(22) = "Finally"
		aKey(23) = "If"
		aKey(24) = "Then"
		aKey(25) = "Do"
		aKey(26) = "While"
		aKey(27) = "Not"
		aKey(28) = "Loop"
		aKey(29) = "Until"
		aKey(30) = "Select"
		aKey(31) = "Case"
		aKey(32) = "Nothing"
		aKey(33) = "Is"
		aKey(34) = "Or"
		aKey(35) = "Else"
		aKey(36) = "ElseIf"
		aKey(37) = "Char"
		aKey(38) = "Byte"
		aKey(39) = "Integer"
		aKey(40) = "Short"
		aKey(41) = "Long"
		aKey(42) = "Single"
		aKey(43) = "Double"
		aKey(44) = "Decimal"
		aKey(45) = "Boolean"
		aKey(46) = "Date"
		aKey(47) = "String"
		aKey(48) = "Static"
		aKey(49) = "Const"
		aKey(50) = "Return"
		aKey(51) = "With"
		aKey(52) = "For"
		aKey(53) = "Next"
		aKey(54) = "Each"
		aKey(55) = "Stop"
		aKey(56) = "Property"
		aKey(57) = "Exit"
		aKey(58) = "Goto"
		aKey(59) = "And"
	End Sub
	'From Events
	Private Sub frmMain_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
		Dim myFrm As Control
		myFrm = sender
		If (myFrm.Height > 250) And (myFrm.Width > 250) Then
			rtbCode.Width = myFrm.Width-10
			rtbCode.Height = myFrm.Height-140
			rtbResults.Top = rtbCode.Height
			rtbResults.Width = myFrm.Width-10
		End If
	End Sub
	'Control Events and functions to support them
	Private Sub rtbCode_SelectionChanged(sender As Object, evArgs As EventArgs) Handles rtbCode.SelectionChanged
		If rtbCode.Enabled Then Me.Text="FreeVB: " & sFileName & " (" & rtbCode.GetLineFromCharIndex(rtbCode.SelectionStart) & ")"
	End Sub
	Private Sub ColorCode(ByVal s as long, ByVal e as long)
		Dim p As integer, i As Integer, p2 As integer
		rtbCode.Enabled = false
		rtbCode.SelectionStart = s
		rtbCode.SelectionLength = e-s
		rtbCode.SelectionColor = Color.Black
		For i = 0 To MAXKEYWORD
			p = s
			Do While (p >= s) And (p<=e)
				p = rtbCode.Find(aKey(i),p,e,2)
				If (p >= s) And (p<=e) Then
					rtbCode.SelectionColor = Color.Blue
					p = p + rtbCode.SelectionLength
				End If
			Loop
		Next i
		p = s
		Do While (p >= s) And (p<=e)
			p = rtbCode.Find("'", p,e,0)
			If (p >= s) And (p<=e) Then
				p2 = InStr(p+1,rtbCode.Text,vbLf,1)
				If (p2 >= p+1) And (p2<=e) Then
					rtbCode.SelectionStart = p
					rtbCode.SelectionLength = p2 - p
					rtbCode.SelectionColor = Color.Green
					p=p2
				End If
				p = p + 1
			End If
		Loop
		p = s
		Do While (p >= s) And (p<=e)
			p = rtbCode.Find("""", p,e,0)
			If (p >= s) And (p<=e) Then
				p2 = rtbCode.Find("""", p + 1,e,0)
				If (p2 >= p+1) And (p2<=e) Then
					rtbCode.SelectionStart = p
					rtbCode.SelectionLength = p2 - p + 1
					rtbCode.SelectionColor = Color.Red
					p=p2
				End If
				p = p + 1
			End If
		Loop
		rtbCode.Enabled = true
	End Sub
	Private Function ColorCodeOldLine() As Integer
		Dim p As integer, s As integer, e As integer, l as integer, iRet As Integer
		iRet=0
		e = rtbCode.SelectionStart
		l = rtbCode.SelectionLength
		s = InStrRev(rtbCode.Text, vbLf, e - 1, 1)
		p = s
		Do While (p > 0) And (p < e)
			p = InStr(p, rtbCode.Text, vbTab)
			If (p > 0) And (p < e) Then
				iRet = iRet + 1
				p = p + 1
			End If
		Loop
		ColorCode(s,e)
		rtbCode.SelectionStart = e
		rtbCode.SelectionLength = l
		ColorCodeOldLine = iRet
	End Function
	Private Sub rtbCode_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles rtbCode.KeyUp
		Dim i As Integer, iTabs As Integer, sTabs As String
		sTabs = ""
		If e.KeyCode = Keys.Return Then
			iTabs = ColorCodeOldLine()
			For i = 1 To iTabs
				sTabs = sTabs & vbTab
			Next i
			rtbCode.SelectedText = sTabs
		End If
	End Sub
	Private Sub mnuFileNew_Click(sender As Object, evArgs As EventArgs) Handles mnuFileNew.Click
		sFileName="untitled.vb"
		Me.Text="FreeVB: " & sFileName
		rtbCode.Text=""
	End Sub
	Private Sub mnuFileOpen_Click(sender As Object, evArgs As EventArgs) Handles mnuFileOpen.Click
		Dim openFile1 As New OpenFileDialog()
		openFile1.DefaultExt = "*.vb"
		openFile1.Filter = "VB.Net Files|*.vb"
		If (openFile1.ShowDialog() = System.Windows.Forms.DialogResult.OK) And (openFile1.FileName.Length > 0) Then
			rtbCode.LoadFile(openFile1.FileName, RichTextBoxStreamType.PlainText)
			sFileName = openFile1.FileName
			Me.Text="FreeVB: " & sFileName
			rtbCode.Visible = False
			ColorCode(0,rtbCode.Text.Length)
			rtbCode.Visible = True
		End If
	End Sub
	Private Sub mnuFileSave_Click(sender As Object, evArgs As EventArgs) Handles mnuFileSave.Click
		rtbCode.SaveFile(sFileName, RichTextBoxStreamType.PlainText)
	End Sub
	Private Sub mnuFileSaveAs_Click(sender As Object, evArgs As EventArgs) Handles mnuFileSaveAs.Click
		Dim saveFile1 As New SaveFileDialog()
		saveFile1.DefaultExt = "*.vb"
		saveFile1.Filter = "VB.NET Files|*.vb"
		If (saveFile1.ShowDialog() = System.Windows.Forms.DialogResult.OK) And (saveFile1.FileName.Length) > 0 Then
			rtbCode.SaveFile(saveFile1.FileName, RichTextBoxStreamType.PlainText)
			sFileName = saveFile1.FileName
			Me.Text="FreeVB: " & sFileName
		End If
	End Sub
	Private Sub mnuFilePrint_Click(sender As Object, evArgs As EventArgs) Handles mnuFilePrint.Click
		rtbResults.Text="print!"
	End Sub
	Private Sub mnuFileExit_Click(sender As Object, evArgs As EventArgs) Handles mnuFileExit.Click
		Me.Dispose()
	End Sub
	Private Sub mnuEditSelectAll_Click(sender As Object, evArgs As EventArgs) Handles mnuEditSelectAll.Click
		rtbCode.SelectionStart=1
		rtbCode.SelectionLength=rtbCode.Text.Length
	End Sub
	Private Function FindText(ByVal searchText As String, ByVal searchStart As Integer, ByVal searchEnd As Integer) As Integer
		Dim returnValue As Integer = -1
		If searchText.Length > 0 And searchStart >= 0 Then
			If searchEnd > searchStart Or searchEnd = -1 Then
				Dim indexToText As Integer = rtbCode.Find(searchText, searchStart, searchEnd, 0)
				If indexToText >= 0 Then returnValue = indexToText
			End If
		End If
		Return returnValue
	End Function
	Private Sub mnuEditFind_Click(sender As Object, evArgs As EventArgs) Handles mnuEditFind.Click
		Dim iFound = FindText(InputBox("Search For:"),1,rtbCode.Text.Length)
		'If iFound then rtbCode.SelectionStart=iFound
	End Sub
	Private Sub mnuColorCode_Click(sender As Object, evArgs As EventArgs) Handles mnuColorCode.Click
		ColorCode(rtbCode.SelectionStart,rtbCode.SelectionStart+rtbCode.SelectionLength)
	End Sub
	Private Function Compile() as Boolean
		Dim bRet As Boolean, p as integer, p2 as integer, sDll as String
		mbCompiling = True
		If Len(Dir(sPath & TMPLOCFILE)) > 0 Then
			Kill(sPath & TMPLOCFILE)
		End If
		rtbCode.SaveFile(sPath & TMPVBFILE, RichTextBoxStreamType.PlainText)
		rtbResults.Text = "vbc.exe /t:"
		If mnuOptConsole.Checked Then
			rtbResults.Text = rtbResults.Text & "exe /debug"
		Else If mnuOptWinExe.Checked then
			rtbResults.Text = rtbResults.Text & "winexe /debug"
		Else
			rtbResults.Text = rtbResults.Text & "windll /debug"
		End If
 		If mnuOptDebug.Checked then
			rtbResults.Text = rtbResults.Text & "+ /out:"
		Else
			rtbResults.Text = rtbResults.Text & "- /out:"
		End If
		If mnuOptWinDll.Checked Then
			rtbResults.Text = rtbResults.Text & sFileName & ".dll"
		Else
			rtbResults.Text = rtbResults.Text & sFileName & ".exe"
		End If
		p=1
		Do While (p>0) 
			p=instr(p,rtbCode.Text,"Imports ",0)
			If (p>0)  And (p<100) Then
				p=p+8
				p2=InStr(p,rtbCode.Text,vbLf)
				If p2>0 Then 
					sDll = Mid(rtbCode.Text,p,p2-p) & ".dll"
					if sDll <> "System.Reflection" Then rtbResults.Text = rtbResults.Text & " /r:" & sDll
				End If	
			End If
		Loop							
 		rtbResults.Text = rtbResults.Text & " " & sPath & TMPVBFILE & " >" & sPath & TMPERRFILE
		rtbResults.Text = rtbResults.Text & vbCrLf & "echo done >" & sPath & TMPLOCFILE
		rtbResults.SaveFile(sPath & TMPBATFILE, RichTextBoxStreamType.PlainText)
		Shell(sPath & TMPBATFILE)
		Do While mbCompiling
			If Len(Dir(sPath & TMPLOCFILE)) > 0 Then mbCompiling = False
			System.Windows.Forms.Application.DoEvents
		Loop
		If Len(Dir(sPath & TMPERRFILE)) > 0 Then rtbResults.LoadFile(sPath & TMPERRFILE, RichTextBoxStreamType.PlainText)
		If rtbResults.Text.Substring(rtbResults.Text.Length-NOERROR.Length,NOERROR.Length)=NOERROR Then
			bRet = True
			rtbResults.Text = rtbResults.Text & "Compilation successful!"
		End If
		Compile = bRet
	End Function
	Private Sub mnuCompile_Click(sender As Object, evArgs As EventArgs) Handles mnuCompile.Click
		Compile
	End Sub
	Private Sub mnuCompileAndRun_Click(sender As Object, evArgs As EventArgs) Handles mnuCompileAndRun.Click
		If Compile() And Not mnuOptWinDll.Checked Then Shell(sPath & sFileName & ".exe") 
	End Sub
	Private Sub mnuCompileCancel_Click(sender As Object, evArgs As EventArgs) Handles mnuCompileCancel.Click
		mbCompiling = false
	End Sub
	Private Sub mnuOptDebug_Click(sender As Object, evArgs As EventArgs) Handles mnuOptDebug.Click
		mnuOptDebug.Checked = Not mnuOptDebug.Checked
		mnuOptRelease.Checked = Not mnuOptRelease.Checked
	End Sub
	Private Sub mnuOptRelease_Click(sender As Object, evArgs As EventArgs) Handles mnuOptRelease.Click
		mnuOptDebug.Checked = Not mnuOptDebug.Checked
		mnuOptRelease.Checked = Not mnuOptRelease.Checked
	End Sub
	Private Sub mnuOptConsole_Click(sender As Object, evArgs As EventArgs) Handles mnuOptConsole.Click
		mnuOptConsole.Checked = Not mnuOptConsole.Checked
		mnuOptWinExe.Checked = Not mnuOptConsole.Checked
		mnuOptWinDll.Checked = Not mnuOptConsole.Checked
	End Sub
	Private Sub mnuOptWinExe_Click(sender As Object, evArgs As EventArgs) Handles mnuOptWinExe.Click
		mnuOptWinExe.Checked = Not mnuOptWinExe.Checked
		mnuOptConsole.Checked = Not mnuOptWinExe.Checked
		mnuOptWinDll.Checked = Not mnuOptWinExe.Checked
	End Sub
	Private Sub mnuOptWinDll_Click(sender As Object, evArgs As EventArgs) Handles mnuOptWinDll.Click
		mnuOptWinDll.Checked = Not mnuOptWinDll.Checked
		mnuOptWinExe.Checked = Not mnuOptWinDll.Checked
		mnuOptConsole.Checked = Not mnuOptWinDll.Checked
	End Sub
	Private Sub DisplayAssemblyInfo(ByVal sAssy as String)
		Try
			Dim a As [Assembly] = [Assembly].LoadFrom(sAssy & ".dll")
			Dim m As [Module]() = a.GetModules()
			Dim j As Integer
			For j = 0 To m.Length - 1
				If Not (m Is Nothing) Then
					Dim types As Type() = m(j).GetTypes()
					Dim i As Integer
					For i = 0 To types.Length - 1
						rtbResults.Text = rtbResults.Text & types(i).FullName & vbcrlf
					Next i
				End If
			Next j
		Catch
			rtbResults.Text = "Unable to display classes of assembly: " & sAssy & ".  Check spelling."
		End Try
	End Sub
	Private Sub mnuHelpAssy_Click(sender As Object, evArgs As EventArgs) Handles mnuHelpAssy.Click
		DisplayAssemblyInfo(InputBox("Assembly:"))
	End Sub
	Private Function GetTypeDescription(ByVal aType As Type) As String
		Dim str As String = Nothing
		If aType.IsClass Then
			str = "class"
		End If
		If aType.IsInterface Then
			str = "interface"
		End If
		If aType.IsValueType Then
			str = "struct"
		End If
		If aType.IsArray Then
			str = "array"
		End If
		Return str
	End Function 'GetTypeDescription
	' Dumps information about the specified type.   
	Private Sub DumpType(ByVal aType As Type)
		Dim baseType As Type = aType.BaseType
		rtbResults.Text = rtbResults.Text & GetTypeDescription(aType) & " " & aType.ToString() & vbcrlf
		rtbResults.Text = rtbResults.Text & "Module:" & aType.Module.FullyQualifiedName & vbcrlf
		DumpInterfaces(aType)
		DumpFields(aType)
		DumpProperties(aType)
		DumpEvents(aType)
		DumpMethods(aType)
		If Not (baseType Is Nothing) Then
                                	DumpType(baseType)
		End If
    	End Sub 'DumpType
	 ' Dumps the interfaces implemented by the specified type.   
	Private Sub DumpInterfaces(ByVal aType As Type)
		Dim info As Type() = aType.GetInterfaces()
		If info.Length <> 0 Then
			rtbResults.Text = rtbResults.Text & "# Interfaces:" &  info.Length & vbcrlf
			Dim i As Integer
			For i = 0 To info.Length - 1
				rtbResults.Text = rtbResults.Text & info(i).FullName & vbcrlf
				DumpType(info(i))
			Next i
		End If
	End Sub 'DumpInterfaces
	' Dumps the public properties directly contained in the specified type   
	Private Sub DumpProperties(ByVal aType As Type)
		Dim pInfo As PropertyInfo() = aType.GetProperties()
		rtbResults.Text = rtbResults.Text & "Properties" & vbcrlf
		Dim found As Boolean = False
		If pInfo.Length <> 0 Then
			Dim curInfo As PropertyInfo = Nothing
			Dim i As Integer
			For i = 0 To pInfo.Length - 1
				curInfo = pInfo(i)
				If curInfo.DeclaringType Is aType Then
					found = True
					Dim flags As String = Nothing
					If curInfo.CanRead And curInfo.CanWrite Then
						flags = "get; set;"
					Else If curInfo.CanRead Then
						flags = "get"
					Else If curInfo.CanWrite Then
						flags = "set"
					End If
					rtbResults.Text = rtbResults.Text + curInfo.ToString() +" " + flags + vbcrlf
				End If
			Next i
		End If
		If Not found Then
			rtbResults.Text = rtbResults.Text & "  (none)" & vbcrlf
		End If
	End Sub 'DumpProperties
	' Dumps the public events directly contained in the specified type
	Private Sub DumpEvents(ByVal aType As Type)
		Dim eInfo As EventInfo() = aType.GetEvents()
		rtbResults.Text = rtbResults.Text & "Events:" & vbcrlf
		Dim found As Boolean = False
		If eInfo.Length <> 0 Then
			Dim i As Integer
			For i = 0 To eInfo.Length - 1
				If eInfo(i).DeclaringType Is aType Then
					found = True
					rtbResults.Text = rtbResults.Text & eInfo(i).ToString() & vbcrlf
				End If
			Next i
		End If
		If Not found Then
			rtbResults.Text = rtbResults.Text & "  (none)" & vbcrlf
		End If
	End Sub 'DumpEvents
	' Dumps the public fields directly contained in the specified type   
	Private Sub DumpFields(ByVal aType As Type)
		Dim info As FieldInfo() = aType.GetFields()
		rtbResults.Text = rtbResults.Text & "Fields:" & vbcrlf
		Dim found As Boolean = False
		If info.Length <> 0 Then
			Dim i As Integer
			For i = 0 To info.Length - 1
				If info(i).DeclaringType Is aType Then
					rtbResults.Text = rtbResults.Text + info(i).ToString() + vbcrlf
					found = True
				End If
			Next i
		End If
		If Not found Then
			rtbResults.Text = rtbResults.Text & "  (none)" & vbcrlf
		End If
	End Sub 'DumpFields
	' Dumps the public methods directly contained in the specified type. 
	Private Sub DumpMethods(ByVal aType As Type)
		Dim mInfo As MethodInfo() = aType.GetMethods()
		rtbResults.Text = rtbResults.Text & "Methods" & vbcrlf
		Dim found As Boolean = False
		If mInfo.Length <> 0 Then
			Dim i As Integer
			For i = 0 To mInfo.Length - 1
				If mInfo(i).DeclaringType Is aType And Not mInfo(i).IsSpecialName Then
					found = True
					Dim modifiers As String = ""
					If mInfo(i).IsStatic Then
						modifiers = "static "
					End If
					If mInfo(i).IsPublic Then
						modifiers = modifiers + "public "
					End If
					If mInfo(i).IsFamily Then
						modifiers = modifiers + "protected "
					End If
					If mInfo(i).IsAssembly Then
						modifiers = modifiers + "internal "
					End If
					If mInfo(i).IsPrivate Then
						modifiers = modifiers + "private "
					End If
 					rtbResults.Text = rtbResults.Text + modifiers + mInfo(i).ToString() + vbcrlf
				End If
			Next i
		End If
		If Not found Then
 			rtbResults.Text = rtbResults.Text & "  (none)" & vbcrlf
		End If
	End Sub 'DumpMethods
	Private Sub DisplayClassInfo(ByVal sClass as String)
		Try
			If InStrRev(sClass,".")>0 Then
				Dim sAssy As String = Microsoft.VisualBasic.Left(sClass,InStrRev(sClass,".")) 
				Dim a As [Assembly] = [Assembly].LoadFrom(sAssy & "dll")
				Dim t As [Type] = a.GetType(sClass)
				If Not (t Is Nothing) Then DumpType(t)
			End If	
		Catch
			rtbResults.Text = "Unable to display properties of class: " & sClass & ".  Check spelling."
		End Try
	End Sub
	Private Sub mnuHelpClass_Click(sender As Object, evArgs As EventArgs) Handles mnuHelpClass.Click
		DisplayClassInfo(InputBox("Class:"))
	End Sub
	'Thats it!
End Class
End Namespace