I have done this sort of thing in the Program class. I just put the below code normally seen in the Main method into a loop.
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
Once the main form has closed the code leaves the 'Run' method and goes into a loop which checks a application global variable to see if it needs to render a new form.
This is over kill if you just want to open a new form but it seems to work quite well if you are regularly 'swapping' your main form in and out.
My code looks (a little) like this...
while (true)
{
if (AppSettings.SomeFormSettng = FormSetting.ShowAnotherForm)
{
Form showThisForm = AppSettngs.TheForm;
if (ThisIsTheFirstRun)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ThisIsTheFirstRun = false;
}
Application.Run(new showThisForm ());
}
else
{
return;
}
}