关键词: 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]  
    { 
        成员#region 成员 
        private static [!output SAFE_CLASS_NAME] m_instance; 
 
        #endregion 
        构造函数#region 构造函数 
 
        private [!output SAFE_CLASS_NAME]() 
        { 
            // 
            // TODO: 在此处添加构造函数逻辑 
            // 
        } 
 
        public static [!output SAFE_CLASS_NAME] GetInstance() 
        { 
            if( m_instance == null ) 
            { 
                m_instance = new [!output SAFE_CLASS_NAME](); 
            } 
            retrun m_instance; 
        } 
 
        #endregion 
    } 

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


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

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

创建自定义的Visual Studio项模板相关推荐

  1. SharePoint 2010 沙盒解决方案以及 Visual Studio 2010 模板

    SharePoint 2010中的沙盒解决方案为SharePoint开发提供了很好的支持.我们在不做场部署的情况下,可以使用很多伟大的功能.但是,沙盒解决方案也有它自有的限制,不是所有的项目模板(pr ...

  2. 修改Visual Studio类模板注释信息

    背景资料 在开发过程中,经常需要给新增的类和接口添加 public 修饰符和一些相关的注释信息,这个工作是机械而且枯燥的,这个可以通过修改VS自带的类模板来实现. 1.首先找到VS的安装目录,例如如下 ...

  3. 创建自己的Visual Studio插件仓库

    文章目录 使用插件的问题 如何建立私有插件仓库 下载插件安装文件 创建插件仓库描述Atom.xml 添加私有插件仓库 下载安装 共享插件仓库 使用插件的问题 目前在使用Visual Studio 20 ...

  4. vs2019创建c语言,Visual Studio 2019创建一个C语言控制台项目

    Visual Studio 2019创建一个C语言控制台项目 1 创建项目 1.1 选择使用内容功能 ① 打开软件后,来到起始页界面,点击[创建新项目] 1.2 填写项目信息 ① 语言选择[C++] ...

  5. Visual Studio 2010 模板缺失

    新建项目时,发现竟然没有SharePoint的项目模板,难道是因为先前用虚拟光驱安装失败,导致了项目模板丢失?查了资料,发现用管理员身份运行Visual Studio 2010 提示符,输入" ...

  6. 如何修改或新增visual studio 的模板

    在 visual studio 中添加模板,我这里是新增mvc.net的模板 vs2017在文件夹=>(举例说明,请替换为相应的安装目录) D:\Program Files (x86)\Micr ...

  7. 【Unity3D】Unity 脚本 ① ( 创建 C# 脚本 | Visual Studio 2019 中打开 C# 脚本 | 编译 C# 脚本 | 挂载 C# 脚本到游戏物体 | 运行脚本 )

    文章目录 一.创建 Unity 脚本 二.Visual Studio 2019 中打开 C# 脚本 三.编译 C# 脚本 四.挂载 C# 脚本到游戏物体 GameObject 1.添加组件方式 2.直 ...

  8. java 文字生成pdf,并创建自定义表单域pdf模板

    目录 本文总共知识点: pom 所有的import 生成带表格的pdf 另一种方式是指定坐标生成文本域 main方法: 创建表单域做为pdf模板: 创建签名域: 根据文字获取坐标位置 完整代码: 本文 ...

  9. [转]利用ASP.NET 2.0创建自定义Web控件(1)

    原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html   简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经 ...

最新文章

  1. Linux学习总结(9)——Linux 新手必知必会的 10 条 Linux 基本命令
  2. vue 微信支付的坑_vue_模式下h5微信支付
  3. 解决WCF接口无法传递object参数的问题
  4. matlab 二维高斯滤波 傅里叶_机器视觉 03.2 频域低通滤波
  5. 【分层图最短路】通信线路
  6. 官网下载mysql连接驱动jar包教程
  7. mpp格式文用什么软件打开
  8. 机器学习应用——强化学习课程总结 实例 “自主学习Flappy Bird游戏”(MDP蒙特卡洛强化学习Q-learningDRLDQN)
  9. vant-uploader上传照片无法删除
  10. 配置计算机能不能关机,详细教你电脑自动关机怎么设置
  11. MGF病毒的利用代码
  12. 五款宝藏浏览器插件推荐,一定要看到最后
  13. 【方案分享】2020个人抖音账号打造执行方案(附下载)
  14. Centos7设置1920x1080分辨率
  15. 需求分析和数据分析那些事。
  16. ERROR: node with name rabbit already running on xxx
  17. 华为路由交换学习篇-链路聚合
  18. 51nod 13831048 整数分解为2的幂 [递推]【数学】
  19. 苹果cms模板_苹果cms怎么更换模板?
  20. 直击|传熊猫直播进入破产清算 副总裁庄明浩已离职

热门文章

  1. (多表)关联update 超过两个字段以上
  2. 某大厂外包员工在工作群抢新年红包,却被要求退回...
  3. 专题导读:数据资产化探索
  4. 【计算机组成原理】双端口RAM和多模块存储器
  5. 【算法分析与设计】习题分享
  6. 【数据库系统】编程语言类型说明系统和DDL的区别
  7. 【形式语言与自动机】有限状态机
  8. 在VS 2010上搭建Windows Phone 7开发平台
  9. MySQL组提交(group commit)
  10. 大数据(9) - Flume的安装与使用