I'm sure you've all seen it before: your program works fine under the debugger, but blows up as soon as you're not attached. This can be caused by any number of things. If you're writing native code, the main cause is the way data initialized in debug mode - determinism under the debugger is the crucial element.

WinForms is another example, though the difference is not quite so extreme. In VS 2003 WinForms has a top-level exception handler which allows WinForms applications to continue after unhandled exceptions, but under the debugger this system is not put in place. This means that WinForms applications are in fact more robust when running outside of the debugger.

In VS 2005, the WinForms team is adding some more code to differentiate runs under a debugger from normal runs. This time it has to do with threading. I'm sure you've all heard the best practice - you should only mess about with UI elements on the correct UI thread. Now, WinForms will enforce that rule when under a debugger. If you see something like "Illegal cross-thread operation" pop up while you're debugging your WinForms app, you've done something wrong.

It may be somewhat confusing though, since you won't see this while running your application normally. Also: as you migrate VS 2003 applications, you may see this pop up where it didn't pop up before. Relax - this is normal.

Though it's not necessarily good news. :0(