Some might consider writing a managed debugger in VB.Net to be an oxymoron. But maybe not. Here's a VB.Net snippet that serves as a highly-specialized debugger to launch an app and print all the modules that get loaded.

This is adapted from the C# sample snippet here that does the same thing. Although we know that VB.Net is theoretically powerful enough to do what C# does, I thought it would be nice to actually concretely see it in VB. 

Writing a whole debugger in VB?
We believe we could have written most of MDbg in VB (instead of C#).  However, just because it's possible doesn't mean that it's easy to do. One concern is that although this is technically possible, I doubt MDbg's usage conforms to the developer-paradigms / design rules that VB developers would expect. People don't want to worry about things like programming with multiple threads, manipulating metadata, and apartments.
However, since MDbg takes care of most of these problems, building  on top of MDbg (like the sample below shows) should be easier.

Other trivia:
FWIW, It only took about 15 minutes for me to port it over, and I don't actually know VB.Net. The IDE really helps you along, and I did a lot of it with Edit + Continue. The biggest problem I had was tracking down the "typeof" operator.  It also initially left off the MTAThread attribute and so it hung at the "proc.Go.WaitOne()" line, and then I remembered that ICorDebug is MTA, and so added the attribute.


'----------------------------------------------------
' Test harness to print all loaded modules
' Ported from C# version at:
' http://blogs.msdn.com/jmstall/archive/2004/11/19/267135.aspx 
'----------------------------------------------------
Imports System
Imports Microsoft.Samples.Debugging.MdbgEngine

Module Module1
    <MTAThread()> Sub Main()
        ' Get target filename from args
        Dim filename As String
        Dim args As String()
        args = System.Environment.GetCommandLineArgs()
        If (args.Length <> 2) Then
            Console.WriteLine("Usage: PrintMods <filename>")
            Console.WriteLine("   Will run <filename> and print all loaded modules.")
            Return
        End If
        filename = args(1)

        Dim debugger As MDbgEngine = New MDbgEngine()

        ' Set options. Specifically need to request Module Loads
        debugger.Options.CreateProcessWithNewConsole = True
        debugger.Options.StopOnModuleLoad = True

        Dim proc As MDbgProcess = debugger.CreateProcess(filename, "", DebugModeFlag.Default, Nothing)

        ' Consume all debug events, sniffing for LoadModules events.
        While (proc.IsAlive)
            proc.Go().WaitOne()
            Dim o As Object = proc.StopReason

            If (TypeOf o Is ModuleLoadedStopReason) Then
                Dim m As ModuleLoadedStopReason = CType(o, ModuleLoadedStopReason)
                Console.WriteLine("Module loaded:" & m.Module.CorModule.Name)
            End If
        End While

        Console.WriteLine("Done!")
    End Sub
End Module