Как добавить существующие проекты в проект Visual Studio с помощью мастера шаблонов - PullRequest
2 голосов
/ 07 декабря 2011

Я хотел бы добавить существующие проекты в новое решение, сгенерированное шаблоном.Могу ли я добиться этого через файл vstemplate или мне нужно использовать IWizard.И если мне нужно использовать IWizard, как я могу правильно работать с ним.В настоящее время я попробовал следующее:

  1. шаблон мультипроекта, который добавляет несколько папок решения и один проект
  2. мастер с пользовательскими данными мастера.$ wizarddata $ содержит несколько относительных путей к проектам, которые уже существуют на жестком диске.В мастере я выбираю базовый путь для этих проектов.Как я могу добавить этот проект сейчас к своему решению?

Основная проблема заключается в том, что объект Solution не содержит ничего:

var type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
var dte2 = (EnvDTE80.DTE2)Activator.CreateInstance(type);
var solution = (EnvDTE100.Solution4)dte2.Solution;
var projects = dte2.ActiveSolutionProjects;

проекты не содержат ни одного проекта,То же самое относится и к dte2.Solution.Projects.Этот код вызывается в функции RunFinished реализации IWizard.Или:

var type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
var dte2 = (EnvDTE80.DTE2)Activator.CreateInstance(type);
dte2.ExecuteCommand("File.AddExistingProject", "X:\\Path\\To\\Project\\ProjectName.csproj");

выдаст исключение COM.Если я выполню ExecuteCommand из макроса в визуальной студии, он будет работать нормально.Что я делаю не так?

1 Ответ

2 голосов
/ 08 декабря 2011

Хорошо, я нашел проблему. Приведенный выше фрагмент кода с созданием DTE-объекта работает некорректно. Если я запомнил AutomationBject из функции RunStarted и буду использовать его в функции RunFinished, все будет работать как положено:

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    // ...
    dte = automationObject as DTE;
}

public void RunFinished()
{
    // ...
    // projects will automatically added relative
    dte.ExecuteCommand("File.AddExistingProject", "\""+path+"\"");
}
...