2015-01-21 3 views
5

Могу ли я создать шаблон элемента, который будет вставлять несколько файлов в разные проекты в рамках одного и того же решения?Шаблон нескольких файлов в нескольких проектах

Я НЕ ищу, чтобы добавить файлы под разными папками в том же проекте.

Это то, что я ищу:

Решение

  • Проект 1

    • элемент шаблона 1
  • Проект 2

    • элемент шаблона 2
+0

Я не уверен, как это будет работать. Как шаблон узнает о том, какой проект использовать для пункта 2? –

+0

Могло просто быть жестко закодированным, но это то, что я пытаюсь выяснить, возможно ли это или нет. – Eccentrikit

+0

Я также ищу ответ на этот вопрос. –

ответ

0

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.

Смежные вопросы