3

私は、.netコアアプリケーション用のビジュアルスタジオプロジェクトテンプレートを作成しました。このテンプレートを使用して新しいプロジェクトを作成するとき、Azure認証とID認証のどちらかを選択する必要があります。これを達成するために、ウィザードを作成しました。ウィザードで選択したオプションに応じて、いくつかの追加ファイルがプロジェクトに含まれている必要があります。私の問題は、これらの余分なファイルを私のプロジェクトにどのように追加するのかという手がかりがないことです。ビジュアルスタジオテンプレートにファイルをプログラムで追加するにはどうすればよいですか?

第一のアプローチ

は、最初に私が項目テンプレートを作成し、私のプロジェクトにその内容を追加しようとしました。

AzureAuthentication.vstemplate

<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; 
       } 
     } 
} 

このアプローチはまったく機能しません。

第二のアプローチは、それから私は、プロジェクトテンプレートに項目テンプレートからの私のテンプレートを変換します。

AzureAuthentication.vstemplate

<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メソッドを使用して、私はそのプロジェクト項目を取得し、私のプロジェクトにアクセスして、この

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

のようにそこに新しいアイテムを追加しようとしましたしかし、私のプロジェクトのProjectItemsはnullです。

私はここで何が欠けていますか?私のアプローチのいずれかが正しかったか、これを達成する良い方法がありますか?

答えて

0

私はこれを第3のアプローチで考え出しました。私はdte.Solution.Projects.Items(0)が自分自身のプロジェクトではなく自分のプロジェクトを含むフォルダを私に与えていたという事実を見逃していました。

私がしなければならなかったすべてを変更することです:

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

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

関連する問題