A question was posted on a MSDN VB forum about how to get single-instance behavior in a Whidbey app when your startup object isn't a form.  The IDE application designer doesn't accommodate this scenario.  But you can get single-instance behavior in situations like this by writing against the application model base class yourself.

Here's an example of a VB8 (Whidbey) console application that exhibits single-instance behavior:

Option Explicit On
Option Strict On

Module Module1
    Sub Main(ByVal args() As String)
        Dim App As New Application
        App.Run(args) 'passing args in enables App.CommandLineArgs
    End Sub
End Module

Class Application
    Inherits Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase

    Sub New()
        'If you are setting your own custom principal instead of using
        'the windows principal, pass AuthenticationMode.ApplicationDefined
        'so we don't run it over in the ctor.  The default ctor puts the
        'windows principal on the main thread.
        MyBase.New()
        Me.IsSingleInstance = True 'Turns on the single-instance behavior
    End Sub

    Protected Overrides Sub OnRun()'Put your code that you'd have place in Main(), here.
        Console.WriteLine("Running as " & My.User.Name & ". Press a key to exit") 
        While Not System.Console.KeyAvailable
            DoEvents() 'pumps messages so StartupNextInstance() gets called
        End While
    End Sub

    Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, _
        ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) _ 
        Handles Me.StartupNextInstance
       
        MsgBox("An attempt to launch an additional instance was made.")
    End Sub
End Class

When you first run this app you'll get the message that it is running and it will just hang out waiting for a key press.  If you launch it again while the first instance is still running, the first instance will display the dialog about an attempt to launch another instance.  The subsequent attempt to launch will just return without launching a new instance.  You now have a single-instance console application.

I am utilizing the single-instance behavior logic which lives in the Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase class.  Note that in the ctor for Application that I call MyBase.New() without any arguments.  This will result in the windows principal being put on the main thread.  My.User will then reflect the windows account that is running this app.  If you are setting your own custom principal, pass in AuthenticationMode.ApplicationDefined instead so that your principal doesn't get run over when the class initializes.

I use Main() simply to create my application object and start it up.  I put my startup logic, i.e. the code that would traditionally be in Main(), inside Application.OnRun(). 

You'll notice that I'm pumping events in OnRun().  Pumping events is only necessary if you want to use the application model events, such as StartupNextInstance().  WindowsApplicationBase uses the message pump to marshal events onto the main thread.  So if you aren't yielding control to windows you'll need to pump messages in your app if you want the app model events.  If you don't care about handling the application model events then you can safely ignore that part.

Note that you also get access to the other application model events such as the Shutdown event.  You won't get the UnhandledException() event because it isn't getting hooked up.  Getting that to work is a subject for another post someday if there is interest in that.

By the way, if you are curious you can see the code generated by the IDE for Windows Forms apps.  Just create a windows forms app, turn on single-instance in the application page of the project designer, turn on 'view all files' in the solution explorer, and then look at the hidden file Application.Designer.vb which is under the MyProject/Application.MyApp node.