代码之家  ›  专栏  ›  技术社区  ›  Manos Pasgiannis

如何以编程方式将文件添加到visual studio模板?

  •  5
  • Manos Pasgiannis  · 技术社区  · 7 年前

    我已经为.net核心应用程序创建了一个visual studio项目模板。当使用此模板创建新项目时,我希望能够在Azure身份验证和身份验证之间进行选择。为了实现这一点,我创建了一个向导。根据向导上选定的选项,项目中必须包含一些其他文件。我的问题是,我不知道如何将这些额外的文件添加到我的项目中。

    第一次进近

    <VSTemplate>
        <TemplateData>
            <!-- code removed for clarity -->
        </TemplateData>
        <TemplateContent>
            <Folder Name="Models" TargetFolderName="Models">
                <ProjectItem ReplaceParameters="true" TargetFileName="RefreshTokenResponse.cs">RefreshTokenResponse.cs</ProjectItem>
            </Folder>
            <Folder Name="Controllers" TargetFolderName="Controllers">
                <ProjectItem ReplaceParameters="true" TargetFileName="UserController.cs">UserController.cs</ProjectItem>
            </Folder>
        </TemplateContent>
    </VSTemplate>
    

    WizardImplementation.cs

    public class WizardImplementation : IWizard {
        public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) {
            dte = automationObject as DTE;
    
            // code removed for clarity
        }
    
        public void ProjectFinishedGenerating(Project project) {
            switch (authenticationType) {
                default: break;
                case AuthenticationType.Azure: {
                        // code removed for clarity
    
                        using (StreamWriter writer = File.CreateText("C:/Users/pasjiannis.OFFICE/Desktop/log.txt")) {
                            dte.Solution.AddFromTemplate(templatePath, projectPath, "AzureAuthentication");
                        }
    
                        break;
                    }
                case AuthenticationType.Identity: {
                        break;
                    }
            }
    }
    

    这种方法根本不起作用。

    然后我将我的模板从项目模板转换为项目模板。

    <VSTemplate>
        <TemplateData>
            <!-- code removed for clarity -->
        </TemplateData>
        <TemplateContent>
            <Project File="AzureAuthentication.csproj" ReplaceParameters="true">
                <Folder Name="Models" TargetFolderName="Models">
                    <ProjectItem ReplaceParameters="true" TargetFileName="RefreshTokenResponse.cs">RefreshTokenResponse.cs</ProjectItem>
                </Folder>
                <Folder Name="Controllers" TargetFolderName="Controllers">
                    <ProjectItem ReplaceParameters="true" TargetFileName="UserController.cs">UserController.cs</ProjectItem>
                </Folder>
            </Project>
        </TemplateContent>
    </VSTemplate>
    

    这部分起了作用。文件已成功添加到我的项目中,但另一个项目也已创建到我的解决方案中。

    我没有在WizardImplementation类中使用AddFromTemplate方法,而是尝试访问我的项目,获取its项目项,然后像这样在那里添加新项

    dte.Solution.Projects.Items(0).ProjectItems.AddFromFile("UserController.cs");
    

    但我的项目中的项目项为空。

    我错过了什么?我的方法是否正确,或者有更好的方法来实现这一点?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Manos Pasgiannis    7 年前

    我用第三种方法解决了这个问题。我忽略了一个事实 dte.Solution.Projects.Items(0)

    dte.Solution.Projects.Items(0).ProjectItems.AddFromFile("UserController.cs");

    dte.Solution.Projects.Items(0).SubProject.ProjectItems.AddFromFile("UserController.cs");