This problem seems to persist in .NET 3.5 SP1 as well as .NET 4.0.
To reproduce the problem you must create a ToolStrip with more items than it can display which causes it to create an overflow button.
The problem only appears when you actually click the overflow button. Clicking it causes a ToolStripOverflow object to be created which subscribes to the Microsoft.Win32.UserPreferenceChangedEventHandler event. The ToolStrip doesn't dispose of the ToolStripOverflow object which causes the event handler to not be removed and causes a leak.
This caused us massive problems in a large app that created forms with ToolStrips on them.
A work around is to change the Dispose method of the form or control that hosts the ToolStrip as follows:
protected override void Dispose(bool disposing)
{
if (disposing)
{
var overflow = toolStrip1.OverflowButton.DropDown as ToolStripOverflow;
if (overflow != null)
overflow.Dispose();
}
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
This solved it for us