1

我需要生成自定义项目模板。我正在向用户展示向导(使用 vsix 项目),该向导具有三个复选框,用户可以在其中选择一个或多个复选框,根据需要创建的项目数量的选择。

假设用户选择一个,那么输出解决方案必须有一个项目。假设用户选择任意两个,那么输出解决方案必须有这两个项目。

目前,无论选择如何,都会创建三个输出项目。根 vsTemplate 文件如下所示,有没有办法满足我的要求?

<ProjectCollection>
      <ProjectTemplateLink ProjectName="Cat">
        CatProject\Cat.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="Dog">
        DogProject\Dog.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="Lion">
        LionProject\Lion.vstemplate
      </ProjectTemplateLink>
</ProjectCollection>

我尝试了两种方法 1)在运行时相应地更改根 vsTemplate 文件,但始终根据 bin 目录中 zip 文件夹中的 vsTemplate 文件创建输出项目。2)使用开发工具环境自动化对象,在IWizard接口的ProjectItemFinished方法中以编程方式添加或删除项目,例如:Dte.Solution.AddFromTemplate(vsTemplatePath, NewProjectName) 上面一行创建了一个新项目但缺少文件夹结构,很难调整它。

有什么简单的方法可以做到这一点吗?

<ProjectCollection>
      if(cat is selected)
      <ProjectTemplateLink ProjectName="Cat">
        CatProject\Cat.vstemplate
       </ProjectTemplateLink>
        end if
      if(Dog is selected)
      <ProjectTemplateLink ProjectName="Dog">
        DogProject\Dog.vstemplate
      </ProjectTemplateLink>
      end if
      if(Lion is selected)
      <ProjectTemplateLink ProjectName="Lion">
        LionProject\Lion.vstemplate
      </ProjectTemplateLink>
      end if
</ProjectCollection>
4

1 回答 1

1

我使用我尝试过的第二种方法使它工作。这是完整的解决方案。记住当我们在项目中添加新的 vstemplate 文件时 build action type 必须是 "vstemplate" ,告诉 soln.GetProjectTemplate 去寻找 vstemplate 类型的文件,否则可能会报错。

这样我们就可以有条件地创建项目。

在此处输入图像描述

 using EnvDTE;
  using EnvDTE80;  

  DTE dte;

public void ProjectFinishedGenerating(Project project)
        {
            //Accessing DTE(Development tool environment) object should only be done on main thread, otherwise throw exception
            ThreadHelper.ThrowIfNotOnUIThread();
            Solution2 soln = (Solution2)dte.Solution;
            if (firstForm.IsCatSelected)
            {                
                dte.Solution.AddFromTemplate(soln.GetProjectTemplate("Cat.vstemplate", "CSharp"), destinationDirectory + "\\Cat", "Cat");               
            }
            if (firstForm.IsDogSelected)
            {
                dte.Solution.AddFromTemplate(soln.GetProjectTemplate("Dog.vstemplate", "CSharp"), destinationDirectory + "\\Dog", "Dog");
            }
        }

public void RunStarted(object automationObject,
            Dictionary<string, string> replacementsDictionary,
            WizardRunKind runKind, object[] customParams)
        {
            //Accessing DTE(Development tool environment) object should only be done on main thread, otherwise throw exception
            ThreadHelper.ThrowIfNotOnUIThread();
            destinationDirectory = replacementsDictionary["$destinationdirectory$"];

            dte = automationObject as DTE;
          }
于 2020-02-21T05:49:40.250 回答