用Visual Studio2019自定义项目模板

项目模板简介

众所周知,在我们使用VS新建项目时,都需要选择一个项目模板,如下图:

我们选择完项目模板进行创建,创建完成之后,可以发现项目中已经包含了一些基础的文件。例如MVC:

可以看到,MVC项目下,这么多的文件、类都给我们自动生成了,我们并不需要敲任何代码。

所以,项目模板,就是在我们创建新项目界面中,给我们列出来的模板文件。

这些文件都是VS自带的,但在实际工作中,很多时候我们需要的是一个跟我们项目的业务更加契合的、可复用的项目模板,这时候就需要我们自己去创建一个自定义的项目模板了。

项目模板创建步骤

创建自定义的项目模板,有以下几个步骤:

  1. 创建一个原始的项目,我们称之为模板源;

  2. 替换模板参数

  3. 导出模板源项目, 给模板项目设置名称、说明、图标等内容

  4. 给项目模板添加语言、平台和项目类型等标签

  5. 使用自定义的项目模板

创建模板源项目

首先我们创建一个原始的项目。
以下是我创建的Demo,添加了几个文件,只是用来做一个简单的例子,实际开发中可能比这复杂的多。

模板中的参数

我们创建出来的模板源项目,有很多内容在创建项目之前是不确定的,比如命名空间、类名称等,这怎么办呢?
VS也给了我们解决办法,我们可以在源项目中,使用模板参数来代替这些不确定的信息,在实际创建项目时,VS会将这些模板参数替换为实际的内容。
以HomeController.cs文件为例,使用模板参数代替命名空间名称:


模板参数以 $参数$ 的格式进行声明 。$safeprojectname$表示的
就是命名空间的模板参数。
VS完整的模板参数如下:

参数描述
clrversion公共语言运行时 (CLR) 的当前版本。
ext_*将 ext_ 前缀添加到任何参数,以引用父模板的变量。例如 ext_safeprojectname。
guid[1-10]一个用于替换项目文件中的项目 GUID 的 GUID。可指定最多 10 个唯一的 GUID(例如,guid1)。
itemname在其中使用参数的文件的名称。
machinename当前的计算机名称(例如,Computer01)。
projectname创建项目时由用户提供的名称。
registeredorganization来自 HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization 的注册表项值。
rootnamespace当前项目的根命名空间。此参数仅适用于项模板。
safeitemname与 itemname 相同,但所有不安全字符和空格替换为了下划线。
safeitemrootname与 safeitemname 相同。
safeprojectname用户在创建项目时提供的名称,但名称中删除了所有不安全字符和空格。
time以 DD/MM/YYYY 00:00:00 格式表示的当前时间。
specifiedsolutionname解决方案的名称。在选中“创建解决方案目录”时,specifiedsolutionname 具有解决方案名称。在未选中“创建解决方案目录”时,specifiedsolutionname 为空。
userdomain当前的用户域。
username当前的用户名称。
webnamespace当前网站的名称。此参数在 Web 窗体模板中用于保证类名是唯一的。如果网站在 Web 服务器的根目录下,则此模板参数解析为 Web 服务器的根目录。
year以 YYYY 格式表示的当前年份。

除了VS自带的模板参数外,用户还可以自定义模板参数,但实际用到的不多,在此就不扩展赘述了。

导出模板

源文件中的模板参数替换好之后,我们就可以导出模板了,操作步骤如下:
打开工具栏中的项目->选择导出模板

弹出【导出模板向导】界面,选择项目模板即可,下方选择的是要导出的项目。

接下来,在模板选项中,填入模板的名称,说明,图标等信息:

注意这个输出位置,这是自定义项目模板存放的路径。

下面的【自动将模板导入 Visual Studio】选项,选中后会将项目模板复制一份,放入到特定的文件夹中,下次创建新项目就可以搜索到了。

点击完成,VS会把项目模板压缩为.zip文件,分别导入到以下两个文件夹中:
C:\Users\Lenovo\Documents\Visual Studio 2019\My Exported Templates

C:\Users\Lenovo\Documents\Visual Studio 2019\Templates\ProjectTemplates

这时候不需要任何其他的操作,打开VS的启动窗口,点开创建新项目,就可以找到ProjectTemplateDemo这个项目模板了。

下面使用这个模板创建一个项目


可以看到,项目的结构与我们项目模板一模一样,命名空间名称也被替换为Demo1了。

给项目模板添加标签

其实到这一步,我们的项目模板就可以正常使用了,但我们会发现一个问题,我们的项目模板没有这样的标签:

虽然不影响使用,但当查找项目模板时,也不是很方便,所以我们需要给创建的项目模板添加几个对应的标签。方法如下:

首先打开这个模板导入到的文件夹,路径:C:\Users\Lenovo\Documents\Visual Studio 2019\Templates\ProjectTemplates

解压ProjectTemplateDemo这个压缩包。
在解压好的ProjectTemplateDemo文件夹里,用VS打开MyTemplate.vstemplate这个文件。

这是一个XML文件,我们需要在TemplateData标签里添加上项目使用语言、平台、项目类型的信息。
语言、平台、项目类型的标签分别为LanguageTag、PlatformTag、ProjectTypeTag。
同时,Visual Studio 提供了一系列内置标签。以下列表是 Visual Studio 中可用的内置标签,对应的值显示在括号中。

语言标签平台标签项目类型标签
C (cpp)Android (android)云 (cloud)
单元格单元格单元格
C# (csharp)Azure (azure)控制台 (console)
F# (fsharp)iOS (ios)桌面 (desktop)
Java (java)Linux (linux)扩展 (extension)
JavaScript (javascript)macOS (macos)游戏 (games)
Python (python)tvOS (tvos)IoT (iot)
查询语言 (querylanguage)Windows (windows)库 (library)
TypeScript (typescript)Xbox (xbox)机器学习 (machinelearning)
Visual Basic (visualbasic)
移动 (mobile)


Office (office)


其他 (other)


服务 (service)


测试 (test)


UWP (uwp)


Web (web)

我们修改这个文件,添加几个对应的标签:

我们把这个文件保存一下,保存之后,跳到文件夹下,全选文件,重新压缩一遍修改好的ProjectTemplateDemo文件:

注意,压缩包必须是.zip文件。

压缩完成后,把这个压缩包拷贝到C:\Users\Lenovo\Documents\Visual Studio 2019\Templates\ProjectTemplates目录下,并覆盖掉旧的压缩包。
然后删除解压后的文件。
这时候重新创建新项目,选择ProjectTemplateDemo项目模板,可以看到我们的标签已经加上去了。

至此,就是自定义项目模板的全部步骤。

总结

自定义的项目模板作用非常大,在大型的项目中,如果使用好的话会大大提升我们的开发效率。

以上就是本文章的全部内容。更多内容可访问我的博客:http://www.yunc.top/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A/B HDU - 1576 (逆元或拓展欧几里得或数学公式)多解法求大数结果

题意:求(A/B)%9973,但由于A很大,我们只给出n(nA%9973)(我们给定的A必能被B整除,且gcd(B,9973) 1)。 思维:(1)逆元扩展欧几里得算法:满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。…

[C++STL]常用排序算法

代码如下: #include <iostream> #include <algorithm> #include <vector> using namespace std;void myPrint(int val) {cout << val << " "; }void test01() {vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);…

新基建火了,开源云计算渠道能做什么?

导语对于开源云计算厂商而言&#xff0c;如果希望在抢滩新基建上构建差异化竞争优势&#xff0c;具备高超的售前技能、售后体验&#xff0c;并拥有创新的技术服务能力与解决方案构建能力是实有必要的。巧了&#xff0c;这些都与渠道构建息息相关。开源云计算厂商在此前的渠道激…

python socket编程之双方相互通信简单实例_Python socket实现的简单通信功能示例

套接字(socket)是计算机网络数据结构&#xff0c;在任何类型的通信开始之前&#xff0c;网络应用程序必须创建套接字&#xff0c;可以将其比作电话的插孔&#xff0c;没有它将无法进行通信常用的地址家族AF_UNIX&#xff1a;基于文件&#xff0c;实现同一主机不同进程之间的通信…

[C++STL]常用拷贝和替换算法

代码如下: #include <iostream> #include <algorithm> #include <vector> #include <ctime> using namespace std;void myPrint(int val) {cout << val << " "; }void test01() {vector<int>v1;for (int i 0; i < 10…

ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记

任务16&#xff1a;oauth2 oidc 实现 client部分实现 client 之前启动一下上一节的 server&#xff0c;启动之前需要清除一些代码注释 Program 的 MigrateDbContextpublic static void Main(string[] args) {BuildWebHost(args)//.MigrateDbContext<ApplicationDbContext&g…

[C++STL]常用算术生成算法

代码如下: #include <iostream> #include <vector> #include <numeric> using namespace std;void test01() {vector<int>v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(), 0);cout << "total …

前端异步对象的原理与使用方法

源宝导读&#xff1a;现今互联网的WEB网站&#xff0c;几乎没有不用到JS异步技术的&#xff0c;虽然大家经常用到&#xff0c;但Javascript提供的异步机制如何才能真正用好呢&#xff0c;可能很多开发小伙伴还有点含糊&#xff0c;本文将从常见的开发场景出发&#xff0c;系统的…

java1.8的stream_JDK1.8新特性(一):stream

搜索热词一.什么是stream&#xff1f;1.概述Java 8 API添加了一个新的抽象称为流Stream&#xff0c;可以让你以一种声明的方式处理数据。这种风格将要处理的元素集合看作一种流&#xff0c; 流在管道中传输&#xff0c; 并且可以在管道的节点上进行处理&#xff0c; 比如筛选&a…

[C++STL]常用集合算法

代码如下: #include <iostream> #include <vector> #include <numeric> #include <algorithm> using namespace std;class myPrint { public:void operator()(int val){cout << val << " ";} };void test01() {vector<int&g…

Seek the Name, Seek the Fame POJ - 2752 (理解KMP函数的失配)既是S的前缀又是S的后缀的子串

题意&#xff1a;给一个字符串S&#xff0c; 求出所有前缀pre&#xff0c;使得这个前缀也正好是S的后缀。 输出所有前缀的结束位置。 就是求前缀和后缀相同的那个子串的长度 然后从小到大输出,主要利用next数组求解。 例如 “ababcababababcabab”&#xff0c; 以下这些前缀…

2020 年了,WPF 还有前途吗?

2020年了&#xff0c;微软的技术也不断更新了, .Net Core 3.1、.Net Framework 4.8以及今年11月推出的.NET 5...win10平台也普及了很多&#xff0c;WPF可以在上面大展身手&#xff0c;可性能和内存占用还是不行&#xff0c;但是WPF强大的UI能力很吸引人。WPF已经凉了吗? 学WPF…

[C++STL]常用查找算法

代码如下: #include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std;void test01() {vector<int>v;for (int i 0; i < 10; i){v.push_back(i);}vector<int>::iterator it find(v.begin(…

php asp 语法,ASP 语法

在我们的 ASP 教程中&#xff0c;每个实例都提供隐藏的 ASP 源代码。这样会使您更容易理解它们的工作原理。向浏览器写输出ASP 文件通常包含 HTML 标签&#xff0c;就像 HTML 文件。然而&#xff0c;ASP 文件也能包含服务器脚本&#xff0c;这些脚本被分隔符 包围起来。服务器脚…

#10003. 「一本通 1.1 例 4」加工生产调度(贪心)

加工生产调度 题目描述 某工厂收到了n个产品的订单&#xff0c;这n个产品分别在A、B两个车间加工&#xff0c;并且必须先在A车间加工后才可以到B车间加工。 某个产品i在A、B两车间加工的时间分别为Ai、Bi。询问怎样安排这n个产品的加工顺序&#xff0c;才能使总的加工时间最短…

不要把异常当做业务逻辑,这性能可能你无法承受

一&#xff1a;背景1. 讲故事在项目中摸爬滚打几年&#xff0c;应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬&#xff3f;┬)&#xff0c;比如说判断一个数字是否为整数,就想当然的用try catch包起来&#xff0c;再进行 int.Parse&#xff0c;如果抛异常就说明不是整…

[设计模式]开闭原则

开闭原则: 对扩展开放&#xff0c;对修改关闭。 增加功能是提过增加代码来实现的&#xff0c;而不是去修改源代码。 代码如下: #include <iostream> #include <string> using namespace std;class Caculaor { public:Caculaor(int a,int b,string c):a(a),b(b…

#10010 「一本通 1.1 练习 6」糖果传递 (数学+贪心)

题目描述 原题来自&#xff1a;HAOI 2008 有 n个小朋友坐成一圈&#xff0c;每人有 ai 颗糖果。每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 1 。求使所有人获得均等糖果的最小代价。 输入格式 第一行有一个整数 &#xff0c;n表示小朋友个数&#xff1b; …

ASP.NET Core在Docker下面生成简易验证码

背景 验证码这个功能是十分常见的&#xff0c;各大系统的登录页面都会有。今天介绍一下最为普通的验证码。无论最终给到前端的是图片格式的验证码还是base64格式的验证码&#xff0c;其实都离不开这样的一步操作&#xff0c;都要先在后台生成一个图片。就个人经验来说&#xff…

[设计模式]迪米特法则

迪米特法则 又叫最少知识法则 类中的成员属性和成员方法&#xff0c;如果不需要对外暴露&#xff0c;就不要设成public。 代码如下: #include <iostream> #include <string> using namespace std;class AbstractBuilding { public:virtual void sale() 0; };cl…