You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:45:52