Ok на основе VS 2017 года я создал один VSIX проект один Библиотека проекта и один пункт Шаблон проекта
1- В шаблон Item проекта создать как запись файлов шаблона один и два. Я также добавил wizardExtension информацию в файле vstemplate как этот
<TemplateContent>
<ProjectItem ReplaceParameters="true" TargetFileName="$fileinputname$Service.cs">Service.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="$fileinputname$DTO.cs">DTO.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="$fileinputname$Message.cs">Message.cs</ProjectItem>
</TemplateContent>
<WizardExtension>
<Assembly>WizardImplementation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</Assembly>
<FullClassName>WizardImplementation.WizardImplementation</FullClassName>
</WizardExtension>
WizardImplementation моя библиотека классов проект.
2- Я добавил пакет TemplateWizardInterface Nuget в проект библиотеки классов и реализую IWizard в классе. В ProjectItemFinishedGenerating я перемещаю второй элемент шаблона, как файл во вторую папку местоположения проекта, и добавляю его в проект программно с помощью Microsoft.Build.Evaluation.ProjectCollection в dll Microsoft.Build.
public void ProjectItemFinishedGenerating(ProjectItem projectItem)
{
if (projectItem.FileNames[0].Contains("DTO") || projectItem.FileNames[0].Contains("Message"))
{
string newPath = Path.GetFullPath(Path.Combine(projectItem.FileNames[0], @"..\Project2\"));
if (!Directory.Exists(newPath))
{
MessageBox.Show($"Message path does not exist. \r\n {newPath}");
}
else
{
var newFullPath = Path.Combine(newPath, projectItem.Name);
File.Move(projectItem.FileNames[0], newFullPath);
var p = Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.GetLoadedProjects(PathInformation.MessageProjectPath).FirstOrDefault();
if (p == null)
p = new Microsoft.Build.Evaluation.Project(PathInformation.MessageProjectPath);
var res = p.AddItem("Compile", newFullPath);
p.Save();
if(res == null)
{
MessageBox.Show("Nothing added to project");
}
else
{
MessageBox.Show($"{res.Count()} item added to project");
}
}
}
}
для получения дополнительной информации о IWizard смотрите по этой ссылке https://msdn.microsoft.com/en-us/library/ms185301.aspx
3- В проекте VSIX я добавил библиотеки классов я создал во второй стадии к активам, по типу Ассамблеи в vsixmanifest. Также я добавил проект шаблона элемента в виде файла и предоставил zip-файл, созданный VS после сборки Item Project в bin.
Я не уверен, как это будет работать. Как шаблон узнает о том, какой проект использовать для пункта 2? –
Могло просто быть жестко закодированным, но это то, что я пытаюсь выяснить, возможно ли это или нет. – Eccentrikit
Я также ищу ответ на этот вопрос. –