最省事方式是用“新建项目”对话框选模板;但需复用结构雷同项目时,应通过visual studio“导出模板向导”将已保存且可编译的项目导出为zip模板,注意项目名仅含合法标识符、勾选“自动导入”、按全名搜索,并确保$vstemplate中正确声明参数(如$safeprojectname$)以避免编译失败。

直接用“创建新项目”对话框选模板,是最省事的方式;但如果你反复新建结构雷同的项目(比如每次都要带 Domain、Application、WebAPI 三层),那光靠内置模板远远不够——得自己导出或打包模板,否则迟早被重复配置拖垮节奏。
怎么从现有项目导出为可复用的模板
核心是用 Visual Studio 自带的“导出模板向导”,但它对项目状态有隐性要求:
- 项目必须已保存且能正常编译,否则导出后新建项目可能报
CS0234或找不到命名空间 - 项目名里不能含空格、中文、点号(
.)等非法标识符字符,否则生成的新项目会因$safeprojectname$替换失败而编译报错 - 如果项目引用了 NuGet 包,向导默认不包含
packages.config或PackageReference元数据,需手动在.vstemplate中补<projecttemplatelink></projecttemplatelink>或确保目标环境已安装对应 SDK - 导出路径默认是
%USERPROFILE%\Documents\Visual Studio 2022\My Exported Templates\,但该位置的 ZIP 文件不会自动出现在“新建项目”界面——必须勾选向导最后一步的 “自动将模板导入 Visual Studio”,才会复制到Templates\ProjectTemplates\目录下
为什么搜不到自己导出的模板
常见原因不是路径错,而是筛选逻辑被绕过:
Visual Studio 18.8.1 官方固定版本安装引导程序,当前条目使用微软发布历史中的 Professional Web Installer,适合旧项目兼容、环境回退、复现特定构建链和排查版本差异等场景。
- 用户导出的模板 不参与语言/平台/项目类型筛选,只支持按名称搜索。比如你导出一个叫
MyCleanArch的 C# 模板,在“创建新项目”里搜clean可能找不到,必须输全MyCleanArch - 如果用了
Type="ProjectGroup"做多项目模板(如分层解决方案),它不会出现在常规模板列表,只会在“新建项目”对话框顶部显示为独立分类,且图标是默认齿轮,容易被忽略 - VSIX 打包的模板需要重启 VS 才生效,且必须在“扩展”→“管理扩展”→“模板”页确认已启用,否则即使安装成功也不显示
- 某些工作负载(如 .NET MAUI、C++ Linux)未安装时,其对应模板即使存在也不会加载,此时搜索框会静默过滤掉相关条目
如何让模板支持动态参数替换
硬编码项目名或命名空间在模板里等于白做,关键靠 .vstemplate 里的参数系统:
- 基础参数如
$safeprojectname$(自动转为合法标识符)、$guid1$(生成唯一 GUID)、$time$都开箱即用,直接写进代码文件或项目文件即可 - 自定义参数(如公司名
$ext_companyname$)必须显式声明在<templateparameters></templateparameters>节点内,并在.vstemplate中设置默认值,否则新建项目时会弹窗强制输入 - 参数替换只作用于文件内容,不修改文件名或文件夹名。想让
MyProject.Domain.csproj也随输入变化?得把整个子目录打包进 ZIP,并在.vstemplate里用<projecttemplatelink projectname="$safeprojectname$.Domain"></projecttemplatelink>显式关联 - 若模板中用了
Directory.Build.props这类全局配置文件,注意它不会被参数替换引擎处理,需改用 MSBuild 属性 +$safeprojectname$占位符并在.csproj中引用
真正卡住人的地方,往往不是不会导出,而是导出后新建项目编译失败却查不到原因——八成是 $safeprojectname$ 在某个 .cs 文件里没替换干净,或者 .vstemplate 里漏写了 <projecttype>CSharp</projecttype> 导致参数引擎压根没启动。动手前先拿一个最简控制台项目试一遍全流程,比对着文档硬调快得多。










