创建自定义的Visual Studio项模板

原创 2007年10月09日 14:16:00
关键词: VisualStudio 模板 VSDIR    VIZ
目的:     创建自己的Visual Studio类模板,以创建实现单例模式(Singleton)的类为例。

1、何为模板?
    可以通过两个例子来简单说明一下。
    当我们在Visual Studio.Net中选择新建项目时,向导通常会提供一些预定义类型的项目供选择,比如“Window应用程序”、“ASP.NET Web应用程序”等。只要你选定其中一个并确定,VS会自动相应的项目结构和部分它认为有用的代码。这些供选择的东东就是模板的一种,叫项目模板(Project Template)
    当我们要在项目中增加某种文件,通常可以使用“添加新项”来实现。例如增加一个新的类或是XML文件等等。此时我们所选择选择的类型也是VS预定义的模板的一种,叫项模板(Item Template)。

2、为什么要使用模板? 
    模板的着眼点是开发效率上,也就是说通过这些模板我们可以让VS自动生成一些常用的文件,并初始化结构和代码以加快开发速度。
     典型的就是VS中“添加新项”时可供选择的那些模板(如组件类、用户控件等等)。

    这篇Post主要关注的是项模板的创建及应用。创建项目模板的方式与此类似可以参考:http://www.carlosag.net/Articles/createVSTemplate.aspx

3、用项模板来做什么?
    既然要创建自己的项模板,那么就要明确打算让这个模板来做什么。既然前面提到了模式,那创建一个能够自动实现单例模式(Singleton)的类的项模板。(BTW:关于Singleton模式本身可以参见:http://www.yoda.arachsys.com/csharp/singleton.html。关于它讨论,这里有一篇http://www.jdon.com/jive/article.jsp?forum=91&thread=17578。)
    这里先给出一种最简单的实现Singleton模式的示例:
    
public sealed class Singleton
{
    
static Singleton instance=null;

    Singleton()
    
{
    }


    
public static Singleton Instance
    
{
        
get
        
{
            
if (instance==null)
            
{
                instance 
= new Singleton();
            }

            
return instance;
        }

    }

}

4、如何创建项模板?
创建一个项模板需要完成以下几步:
    a、创建项模板的VSDIR文件 [ VSDIR文件的描述可以参见 http://msdn.microsoft.com/library/chs/default.asp?url=/library/chs/vsintro7/html/vxconvsdirfiles.asp
    b、创建VSZ文件(项目控件)[ VSZ文件的描述可以参见http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/vclrfunderstandingprojectcontrolfiles.asp
    c、定制javascripts
    d、创建文件模板

下面就逐一展开。 
     
    创建VSDIR文件

    -打开文件夹<Program Files>/Microsoft Visual Studio .NET 2003/VC#/CSharpProjectItems/LocalProjectItems/Code
    打开code.vsdir文件,并在其中添加如下内容: 
    ../../CSharpAddSingletonClassWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|Singleton类|11|Singleton类|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|SingletonClass.cs
    * 注意:
    以上内容不要换行。这个文件格式定义见VSDIR文件描述
    其中CSharpAddSingletonClassWiz.vsz是指所使用的vsz文件(项目控件)的位置。 
    如后面的图中显示的,添加此内容后Singleton类模板将出现在“本地项目项”的“代码”分支下。如果需要在“本地项目项”下也显示此“Singleton类”模板,则需要在<Program Files>/Microsoft Visual Studio .NET 2003/VC#/CSharpProjectItems/LocalProjectItems目录下的LocalProjectItems.vsdir文件中添加:../CSharpAddSingletonClassWiz.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|Singleton类|11|Singleton类|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4515|0|SingletonClass.cs

    创建VSZ文件
    -打开文件夹<Program Files>/Microsoft Visual Studio .NET 2003/VC#/CSharpProjectItems
        创建文件CSharpAddSingletonClassWiz.vsz,在其中添加如下内容:
    VSWIZARD 7.0
    Wizard=VsWizard.VsWizardEngine.7.1
    Param="WIZARD_NAME = CSharpAddSingletonClassWiz"
    Param="WIZARD_UI = FALSE"
    Param="PROJECT_TYPE = CSPROJ"
    *注意:VSZ文件格式定义见VSZ文件描述
    其中比较重要的是Param="WIZARD_NAME = CSharpAddSingletonClassWiz",这里“CSharpAddSingletonClassWiz”是指定了当创建Singleton类时使用的向导名称。 

    定制javascripts

    打开目录<Program Files>/Microsoft Visual Studio .NET 2003/VC#/VC#Wizards
    新建一个名为CSharpAddSingletonClassWiz的目录,这个名称是和Param="WIZARD_NAME = CSharpAddSingletonClassWiz"中WIZARD_NAME对应的。
    打开这个目录,创建目录Scripts,然后再在Scripts下创建目录1033。然后创建default.js文件。在其中放置如下代码:
    
function OnFinish(selProj, selObj)
{
    
var oldSuppressUIValue = true;
    
try
    {
        
var strTarget = wizard.FindSymbol("ITEM_NAME");
        
var strClassName = strTarget.split(".");
        
var bValid = wizard.ValidateCLRIdentifier(strClassName[0]);
        
if (!bValid)
        {
            wizard.ReportError();
            
return VS_E_WIZARDBACKBUTTONPRESS;
        }
        oldSuppressUIValue 
= dte.SuppressUI;
        
var strProjectName     = wizard.FindSymbol("PROJECT_NAME");
        
var strSafeProjectName     = CreateSafeName(strProjectName);
        wizard.AddSymbol(
"SAFE_PROJECT_NAME", strSafeProjectName);
        SetTargetFullPath(selObj);
        
var strProjectPath    = wizard.FindSymbol("TARGET_FULLPATH");
        
var strTemplatePath     = wizard.FindSymbol("TEMPLATES_PATH");

        
var strTpl = "";
        
var strName = "";
        
var InfFile = CreateInfFile();

        AddReferencesForClass(selProj);
        AddFilesToCSharpProject(selObj, strProjectName, strProjectPath, InfFile, 
true);
    }
    
catch(e)
    {
        
if( e.description.length > 0 )
            SetErrorInfo(e);
        
return e.number;
    }
    
finally
    {
           dte.SuppressUI 
= oldSuppressUIValue;
           
if( InfFile )
            InfFile.Delete();
    }
}

function SetFileProperties(oFileItem, strFileName)
{
}

    *注意: 在这个JS文件中出现的方法调用可以在路径<Program Files>/Microsoft Visual Studio .NET 2003/VC#/VC#Wizards/2052下的common.js中找到,其中有比较清楚的注释说明。
    
    创建文件模板

    转到路径:<Program Files>/Microsoft Visual Studio .NET 2003/VC#/VC#Wizards/CSharpAddSingletonClassWiz,创建目录Templates,再在Templates目录下创建目录1033。目录创建完毕后添加文件Templates.inf,内容是:File1.cs(这个File1.cs是指我们所使用的文件模板名称)。随后创建文件File1.cs,根据前面给出Singleton模式示例的格式添加以下代码:
    
namespace [!output SAFE_NAMESPACE_NAME] 
{
    
using System;
    
/// <summary>
    
/// [!output SAFE_CLASS_NAME].
    
/// </summary>

    class [!output SAFE_CLASS_NAME] 
    
{
        
成员
        
构造函数
    }

}

    
好了。通过以上的步骤就完成了一个项模板的定制。
当我们再打开一个项目,选择“添加新项”时,会发现在本地项目项中多了一个"Singleton类"的模板。如图:

同时在“本地项目项”的分支“代码”中也可以看到“Singleton类”模板。
当选定打开后并查看代码,可以发现所创建的类实现前面说描述的Singleton模式。

OK。至此,如何来自定义项模板就基本清楚了。进而通过这种方式,我们可以尝试自定义项模板的集合,例如可以把常用的一些模式实现作成项模板,这样无疑会对开发效率的提高有所帮助!

BTW:刚刚发现这篇点缀自定义VS.NET2003有所重复,呵呵~ 
 

Visual Studio Express 在C/C++项目中无法为项目添加新建项

Visual Studio Express 2015 添加新建项时,已安装模板为空的解决方案
  • u012433948
  • u012433948
  • 2016年07月02日 22:26
  • 1837

使用VS2010自定义C++模板

使用VS2010自定义C++模板最近需要自定义生成C++模板,网上查阅不少资料,最终成功完成。归纳一下具体的流程,以供以后直接使用,免去重复搜索。1.生成模板工程打开VS2010,新建项目,在Visu...
  • jsairre
  • jsairre
  • 2016年05月13日 22:28
  • 1816

Visual Studio 自定义项目模板

经常我们需要新建一个项目,然后新建我们的View文件夹,ViewModel文件夹,Model文件夹,还有把我们的ViewModelBase放入我们的VIewModel,如果还用框架,还需要加上好多。而...
  • lindexi_gd
  • lindexi_gd
  • 2016年11月02日 10:46
  • 1470

visual studio 2010 中VC++自定义项目模板

时候像奔跑彭湃的急湍,它一往无还,尽不沉醉。比来在win平台上用opencv,每次新建项目都要设备包含目次、库目次、连接器依附项等等项目属性,感觉很不便利,于是想在vs2010中应当有斗劲智能的体式格...
  • hudfang
  • hudfang
  • 2014年08月21日 10:22
  • 1415

用Visual studio 创建自定义控件

想了解一下自定义控件的知识,不过,在自
  • haoyujie
  • haoyujie
  • 2014年04月17日 17:22
  • 2142

Visual Studio 2012中的为创建类时的添加注释模板

,我们往往需要给类添加注释,我们可以把注释块复制出来,放到文件中,然后在需要的时候,复制、粘贴。这样的重复劳动增加了程序员的体力劳动,而VS中给我们提供了项模版,我们只需要在其中修改一点点模版就能达到...
  • dyllove98
  • dyllove98
  • 2013年03月19日 10:59
  • 2850

【Visual Studio】VS2012中添加模板

牛腩新闻发布系统中,老师用的是vs2008版本,在提到创建我的模板的时候,我用的vs2012就有点跟不上节奏了。 下去查了一下再vs2012中创建模板的方法,如下所示,我举个栗子,添加类库模板。 ...
  • Gnd15732625435
  • Gnd15732625435
  • 2016年10月09日 02:47
  • 4509

visual studio如何自定义快捷键

工具->选项,环境->键盘,在右边的“显示命令包含”中输入自己想要更改的快捷键的“代号”进行查找,选中自己要更改的快捷键并在下面重新设置新的快捷方式即可。 其中“代码助手”快捷键的“代号”是Edit....
  • liuzhushiqiang
  • liuzhushiqiang
  • 2013年09月27日 22:39
  • 15199

visual studio导出项目模板

visual studio中除了微软自带的模板之外,我们还可以自制些模板,供自己使用或分享与他人使用。在开发中给我们很大的便利,提高开发效率。一、实验条件 - IDE版本:visu...
  • weiwei_c
  • weiwei_c
  • 2015年10月24日 17:36
  • 1005

Visual Studio 2012中创建C++/CLR项目时,没有Windows Forms模板的问题

用VC++ 2012在CLR中建立Windows窗口应用程序时,却没有显示可用的Windows Forms 模板,如图:    在Visual Studio 2012帮助文件中查找...
  • qq_20545159
  • qq_20545159
  • 2014年09月10日 20:09
  • 1610
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建自定义的Visual Studio项模板
举报原因:
原因补充:

(最多只允许输入30个字)