Converting Visual Studio 2003 WinForms to Visual Studio 2005/2008 partial classes
.NET 2.0 introduced partial classes which enables “.designer” files in Visual Studio 2005 and later. That is, all of the visual designer-generated code (control declarations, the InitializeComponent method, etc) can be kept in a file separate from your regular code. When you open up a .NET 1.x Visual Studio 2003 WinForms project up in Visual Studio 2005/2008 it will upgrade your project to .NET 2.0 just fine, but unfortunately it doesn’t migrate your WinForms classes over to the new “.designer” project structure.
Initially I thought this would be a job for a DXCore plug-in (the free framework upon which CodeRush is built) as it provides plug-ins with an object model of the code which could be used to grab all the right members and move them over into a designer file. Before I looked into this though I checked what the options were for simply implementing it as a Visual Studio Macro. I was fully expecting to have to use a regular expression to grep the code file to perform the task, but was pleasantly surprised to find that the Visual Studio extensibility API in available to macros provides a code model (based on the .NET CodeDom I presume) which you can traverse to inspect and manipulate the underlying code.
So, here’s what the resulting “ExtractWinFormsDesignerFile” macro does:
- Locates the first class in the selected project item (
DTE.SelectedItems.Item(1).ProjectItem) by traversing theProjectItem.FileCodeModel.CodeElements - Extracts the
InitializeComponentandDisposemethods from the class by traversingCodeClass.Members - Extracts all control fields: that is, all fields whose type derives from
System.Windows.Forms.ControlorSystem.ComponentModel.Containeror whose type name starts withSystem.Windows.Forms - Puts all the extracted code into a new “FormName.Designer.cs” file.
This is currently C# only - it could easily be converted to generated VB.NET code or adapted use the FileCodeModel properly and perhaps create the code in an language-agnostic way when generating the designer file. I took a shortcut in just generating the designer file as a string and writing it directly to a file.
To “install”: download the macro text and copy the methods into a Visual Studio Macro Module (use ALT+F11 to show the Macro editor).
To use:
- Select a Windows Form in the Solution Explorer
- Run the macro by showing the Macro Explorer (ALT+F8) and double-clicking the ‘ExtractWinFormsDesignerFile’ macro. (Obviously you can hook the macro up to a toolbar button if you like.)
- You will then be prompted to manually make the Form class partial (another bit I was too lazy to work out how to get the macro to do): i.e. change
public class MyForm : Form
topublic partial class MyForm : Form
Please leave a comment if this helps you.
2 Comments so far
Leave a reply
Hi Duncan
I came across your blog today and have just converted a project with over 100 forms to partial classes using your macro.
Thanks a lot for saving me a lot of work.
Mike Smith
Big thanks. Works like a charm.