如何通过C#代码结合VSIX Extension向导在VS2022中添加自定义Item Template?
用C#代码通过VSIX Extension添加自定义Item Template到项目
1. 准备自定义Item Template
- 先确保你的Item Template配置完整:
.vstemplate文件要包含TemplateData(定义模板名称、图标等)和TemplateContent(指定模板文件)节点,示例如下:<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Item"> <TemplateData> <Name>My Custom Item</Name> <Description>A custom item template</Description> <Icon>Icon.ico</Icon> <TemplateID>MyCompany.MyCustomItem</TemplateID> <ProjectType>CSharp</ProjectType> </TemplateData> <TemplateContent> <ProjectItem ReplaceParameters="true">MyCustomItem.cs</ProjectItem> </TemplateContent> </VSTemplate> - 把模板相关文件(
.vstemplate、.cs、图标等)放到VSIX项目的Templates/ItemTemplates目录下,选中所有模板文件,在属性窗口设置复制到输出目录为始终复制。
2. 创建VSIX项目并添加自定义向导
- 在Visual Studio中新建「VSIX项目」,选择对应版本的模板。
- 右键项目 → 添加 → 新建项 → 选择「自定义向导」(Custom Wizard),生成向导的基础代码框架。
3. 编写添加模板的C#逻辑
- 打开向导的
IWizard实现类(默认是Wizard.cs),在RunStarted方法中编写核心逻辑:using EnvDTE; using EnvDTE80; using Microsoft.VisualStudio.TemplateWizard; using System; using System.Collections.Generic; using System.IO; public class Wizard : IWizard { private DTE2 _dte; public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) { _dte = (DTE2)automationObject; // 获取当前选中的项目(如需灵活选择,可通过DTE UI交互获取) Project targetProject = _dte.Solution.Projects.Item(1); // 拼接模板文件的绝对路径(VSIX部署后的路径) string assemblyPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); string templateFullPath = Path.Combine(assemblyPath, "Templates/ItemTemplates/MyCustomTemplate.vstemplate"); // 替换模板参数(可选,比如自定义命名空间、类名) replacementsDictionary.Add("$CustomNamespace$", targetProject.Properties.Item("DefaultNamespace").Value.ToString()); replacementsDictionary.Add("$CustomClassName$", "MyGeneratedClass"); // 将模板添加到项目根目录,指定生成后的文件名 targetProject.ProjectItems.AddFromTemplate(templateFullPath, "MyGeneratedClass.cs"); } // 实现IWizard的其他空方法 public void BeforeOpeningFile(ProjectItem projectItem) { } public void ProjectFinishedGenerating(Project project) { } public void ProjectItemFinishedGenerating(ProjectItem projectItem) { } public void RunFinished() { } public bool ShouldAddProjectItem(string filePath) => true; }
4. 配置VSIX清单
- 打开
source.extension.vsixmanifest文件:- 切换到「资产」选项卡,点击「添加」,选择类型为
Microsoft.VisualStudio.ItemTemplate,源选择「文件系统」,路径指向你的Templates/ItemTemplates目录。 - 在「安装目标」选项卡,设置正确的Visual Studio版本,确保和你的开发环境匹配。
- 切换到「资产」选项卡,点击「添加」,选择类型为
5. 调试与验证
- 设置VSIX项目为启动项目,按F5启动实验性Visual Studio实例。
- 在实验实例中打开或新建一个C#项目,通过你配置的触发方式(比如右键项目 → 添加 → 新建项,找到你的自定义模板)执行向导,检查是否成功生成目标文件,且参数替换正常。
常见问题
- 模板找不到:检查模板文件的「复制到输出目录」属性是否设置正确,路径拼接是否有误。
- 参数不替换:确保模板文件中使用的占位符(如
$CustomNamespace$)和replacementsDictionary中的键完全一致,且在AddFromTemplate前已添加。 - 权限报错:确保实验性Visual Studio实例有写入项目目录的权限,关闭可能占用文件的进程。
内容的提问来源于stack exchange,提问作者jose
相关产品推荐
相关产品推荐

