创建自定义的Visual Studio项模板

关键词: 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模式的示例:
    
None.gif public   sealed   class  Singleton
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
static Singleton instance=null;
InBlock.gif
InBlock.gif    Singleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static Singleton Instance
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
get
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (instance==null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                instance 
= new Singleton();
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return instance;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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文件。在其中放置如下代码:
    
None.gif function  OnFinish(selProj, selObj)
None.gif{
None.gif    
var  oldSuppressUIValue  =   true ;
None.gif    
try
None.gif    {
None.gif        
var  strTarget  =  wizard.FindSymbol( " ITEM_NAME " );
None.gif        
var  strClassName  =  strTarget.split( " . " );
None.gif        
var  bValid  =  wizard.ValidateCLRIdentifier(strClassName[ 0 ]);
None.gif        
if  ( ! bValid)
None.gif        {
None.gif            wizard.ReportError();
None.gif            
return  VS_E_WIZARDBACKBUTTONPRESS;
None.gif        }
None.gif        oldSuppressUIValue 
=  dte.SuppressUI;
None.gif        
var  strProjectName      =  wizard.FindSymbol( " PROJECT_NAME " );
None.gif        
var  strSafeProjectName      =  CreateSafeName(strProjectName);
None.gif        wizard.AddSymbol(
" SAFE_PROJECT_NAME " , strSafeProjectName);
None.gif        SetTargetFullPath(selObj);
None.gif        
var  strProjectPath     =  wizard.FindSymbol( " TARGET_FULLPATH " );
None.gif        
var  strTemplatePath      =  wizard.FindSymbol( " TEMPLATES_PATH " );
None.gif
None.gif        
var  strTpl  =   "" ;
None.gif        
var  strName  =   "" ;
None.gif        
var  InfFile  =  CreateInfFile();
None.gif
None.gif        AddReferencesForClass(selProj);
None.gif        AddFilesToCSharpProject(selObj, strProjectName, strProjectPath, InfFile, 
true );
None.gif    }
None.gif    
catch (e)
None.gif    {
None.gif        
if ( e.description.length  >   0  )
None.gif            SetErrorInfo(e);
None.gif        
return  e.number;
None.gif    }
None.gif    
finally
None.gif    {
None.gif           dte.SuppressUI 
=  oldSuppressUIValue;
None.gif           
if ( InfFile )
None.gif            InfFile.Delete();
None.gif    }
None.gif}
None.gif
None.gif
function  SetFileProperties(oFileItem, strFileName)
None.gif{
None.gif}

    *注意: 在这个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模式示例的格式添加以下代码:
    
None.gif namespace  [ ! output SAFE_NAMESPACE_NAME] 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
using System;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// [!output SAFE_CLASS_NAME].
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    class [!output SAFE_CLASS_NAME] 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
成员#region 成员
InBlock.gif        
private static [!output SAFE_CLASS_NAME] m_instance;
InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ContractedSubBlock.gifExpandedSubBlockStart.gif        
构造函数#region 构造函数
InBlock.gif
InBlock.gif        
private [!output SAFE_CLASS_NAME]()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//
InBlock.gif            
// TODO: 在此处添加构造函数逻辑
InBlock.gif            
//
ExpandedSubBlockEnd.gif
        }

InBlock.gif
InBlock.gif        
public static [!output SAFE_CLASS_NAME] GetInstance()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if( m_instance == null )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                m_instance 
= new [!output SAFE_CLASS_NAME]();
ExpandedSubBlockEnd.gif            }

InBlock.gif            retrun m_instance;
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
    
好了。通过以上的步骤就完成了一个项模板的定制。
当我们再打开一个项目,选择“添加新项”时,会发现在本地项目项中多了一个"Singleton类"的模板。如图:
dfasfsa.JPG
同时在“本地项目项”的分支“代码”中也可以看到“Singleton类”模板。
当选定打开后并查看代码,可以发现所创建的类实现前面说描述的Singleton模式。

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

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

转载于:https://www.cnblogs.com/andrewbao/archive/2005/01/28/98878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值