Visual Studio Templates – Add New Item to project

Using Visual Studio to write code requires creating a project (well, you can use Visual Studio without a project, but you won’t get very much past Notepad functionality – there’s not even Intellisense on files) . After creating / opening an existing project, we can add new files (classes, class diagrams, XML files etc) by selecting the Project menu, then Add New Item (or add Class / Windows Forms / Windows Component or User Control, if this is what you need). After you specify all the details (file name), a file is added with some default text in it. Assuming you have Visual Studio 2008 SP1 installed, the templates that generate this text are stored at %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates and %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplatesCache (for x64 machines, look in % ProgramFiles(x86)% ).

Let’s add a new C# class, Tester, to the class library project SimpleTests. By default, in Visual Studio 2008 it will contain the following text:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace SimpleTests

{

    class Tester

    {

    }

}

 

This text comes from the Class template. If we look in the ProjectTemplateCache folder, inside CSharp (the language we used to add the class) -> Code -> 1033 -> Class.zip, we find a class.cs looking like this:

 

using System;

using System.Collections.Generic;

$if$ ($targetframeworkversion$ == 3.5)using System.Linq;

$endif$using System.Text;

 

namespace $rootnamespace$

{

      class $safeitemrootname$

      {

      }

}

 

This explains the text we get. But how can we customize the default? I really would appreciate some changes:

- I don’t want all these usings added by default – I prefer to start without any using statement, and to add them while the code requires them. Of course, I could do it the other way around: add all the usings I think I may need; when I am done coding, remove the unused ones. Visual Studio lets you do that easily by right clicking on the page, selecting Organize Usings -> Remove Unused Usings (or Remove and Sort).

- Second, I prefer Usings inside the namespace declaration and I want to add a header to the file.

I can change the Class.cs file and replace the Class.zip in ProjectTemplatesCache folder:

 

//------------------------------------------------------------

// Copyright (c) Oana Platon

//------------------------------------------------------------

 

namespace $rootnamespace$

{

    using System;

   

    class $safeitemrootname$

    {

    }

}

 

Then when I reopen Visual Studio and Add a class, I get this file:

 

//------------------------------------------------------------

// Copyright (c) Oana Platon

//------------------------------------------------------------

 

namespace SimpleTests

{

    using System;

 

    class MyCustomizedTester

    {

    }

}

 

Cool, right?

This change will be lost the first time when devenv /installvstemplates command is called (this command replaces the ItemTemplatesCache folder with what finds in ItemTemplates folder). To make it permanent, make the change in ItemTemplates folder instead and run devenv /installvstemplates to propagate the change to ItemTemplatesCache.