<p>We're working on a very large .NET WinForms composite application - not CAB, but a similar home grown framework.  We're running in a Citrix and RDP environment running on Windows Server 2003.  </p>

<p>We're starting to run into random and difficult to reproduct "Error creating window handle" error that seems to be an old fashion handle leak in our application.  We're making heavy use of 3rd Party controls (Janus GridEX, Infralution VirtualTree, and .NET Magic docking) and we do a lot of dynamic loading and rendering of content based on metadata in our database.</p>

<p>There's a lot of info on Google about this error, but not a lot of solid guidance about how to avoid issues in this area.</p>

<p>Does the stackoverflow community have any good guidance for me for building handle-friendly winforms apps?</p>

I have tracked down a lot of issues with UIs not unloading as expected in WinForms.
Here are some general hints:
alot of the time, a control will stay in use because controls events are not properly removed (the tooltip provider caused us really large issues here) or the controls are not properly Disposed.
use 'using' blocks around all modal dialogs to ensure that they are Disposed
there are some control properties that will force the creation of the window handle before it is necessary (for example setting the ReadOnly property of a TextBox control will force the control to be realized)
use a tool like the
.Net Memory profiler
to get counts of the classes that are created.  Newer versions of this tool will also track GDI and USER objects.
try to minimize your use of Win API calls (or other DllImport calls).  If you do need to use interop, try to wrap these calls in such a way that the using/Dispose pattern will work correctly.