如何以编程方式将文件添加到 visual studio 模板?
How can I add files programmatically to a visual studio template?
我已经为 .net 核心应用程序创建了一个 visual studio 项目模板。使用此模板创建新项目时,我希望能够在 Azure 身份验证和身份验证之间 select。为了实现这一点,我创建了一个向导。根据向导中的 selected 选项,项目中必须包含一些附加文件。我的问题是我不知道如何将这些额外文件添加到我的项目中。
第一种方法
起初我创建了一个项目模板并尝试将其内容添加到我的项目中。
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 class 中使用 AddFromTemplate 方法,而是尝试访问我的项目,获取其项目项并像这样在其中添加新项
dte.Solution.Projects.Items(0).ProjectItems.AddFromFile("UserController.cs");
但是我项目中的 ProjectItems 为空。
我在这里错过了什么?我的方法是否正确或是否有更好的方法来实现此目的?
我使用第三种方法解决了这个问题。我错过了 dte.Solution.Projects.Items(0)
给我的是包含我的项目的文件夹,而不是项目本身。
我所要做的就是改变:
dte.Solution.Projects.Items(0).ProjectItems.AddFromFile("UserController.cs");
到
dte.Solution.Projects.Items(0).SubProject.ProjectItems.AddFromFile("UserController.cs");
我已经为 .net 核心应用程序创建了一个 visual studio 项目模板。使用此模板创建新项目时,我希望能够在 Azure 身份验证和身份验证之间 select。为了实现这一点,我创建了一个向导。根据向导中的 selected 选项,项目中必须包含一些附加文件。我的问题是我不知道如何将这些额外文件添加到我的项目中。
第一种方法
起初我创建了一个项目模板并尝试将其内容添加到我的项目中。
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 class 中使用 AddFromTemplate 方法,而是尝试访问我的项目,获取其项目项并像这样在其中添加新项
dte.Solution.Projects.Items(0).ProjectItems.AddFromFile("UserController.cs");
但是我项目中的 ProjectItems 为空。
我在这里错过了什么?我的方法是否正确或是否有更好的方法来实现此目的?
我使用第三种方法解决了这个问题。我错过了 dte.Solution.Projects.Items(0)
给我的是包含我的项目的文件夹,而不是项目本身。
我所要做的就是改变:
dte.Solution.Projects.Items(0).ProjectItems.AddFromFile("UserController.cs");
到
dte.Solution.Projects.Items(0).SubProject.ProjectItems.AddFromFile("UserController.cs");