2013-06-08 2 views
3

Возможно ли изменить решение и использовать инструменты envdte из проекта командной строки?Открыть решение DTE из другой программы (а не надстройки)

У меня есть надстройка, которая модифицирует решение. Но ... изменения необходимы для более чем сотни проектов ... Поэтому я хотел бы сделать программу C#, которая имеет ту же логику, только она выполняет итерацию через все файлы решений.

Надстройка начинается с

EnvDTE.Solution solution = (EnvDTE.Solution)application.Solution; 

DTE2 application, где передается от надстройки ...

Как я могу получить такое же решение, которое я запроса для проектов ... Из отдельной программы, которая будет знать только решениеPath?

Можно ли открыть решение, обработать его и закрыть - чтобы перейти к следующему решению?

Microsoft дает этот пример http://msdn.microsoft.com/en-us/library/envdte._solution.open(v=vs.100).aspx

Но я не знаю, что ООД в контексте ...

Спасибо ...

VS 2010

редактировать: Я сделал то, что предлагает ниже. Слегка изменен, используя ссылку: http://msdn.microsoft.com/en-us/library/ms228772(v=vs.100).aspx

Спасибо

ответ

6

Да вы можете. Вам просто нужно активировать экземпляр, используя COM CLSID для Visual Studio. Ниже приведен пример. Он фактически создает решение и добавляет к нему два проекта, но при открытии существующего решения применяется та же инициализация.

Несколько предостережений:

  1. ум потоковая модель COM. Код, созданный из шаблона консольного приложения достаточно:

    [STAThread] 
    static void Main() 
    
  2. Если у вас есть мощный VS расширения, как ReSharper установлен, вы могли бы быть лучше подвешивания его, если он не нужен для автоматизации VS. У ReSharper были VS-команды, которые управляют им.

    Console.WriteLine("Opening Visual Studio"); 
        var dte = (DTE)Activator.CreateInstance(Type.GetTypeFromProgID("VisualStudio.DTE.10.0",true),true); 
    
        Console.WriteLine("Suspending Resharper"); 
        dte.ExecuteCommand("ReSharper_Suspend"); 
    
        Console.WriteLine("Working with {0}, {1} edition", dte.FullName, dte.Edition); 
        dte.SuppressUI = true; 
        dte.UserControl = false; 
    
        foreach (var solution in mySolutionInfoList) 
        { 
         try 
         {      
          dte.Solution.Create(solution.directory, solution.name);      
          dte.Solution.AddFromTemplate(csharpTemplatePath, solution.directory + "ClassLibrary1", "ClassLibrary1"); 
          dte.Solution.AddFromTemplate(vcTemplatePath, solution.directory + "Win32Dll", "Win32Dll"); 
          Directory.CreateDirectory(solution.directory); // ensure directory exists. Otherwise, user will be asked for save location, regardless of SupressUI value 
          dte.Solution.Close(true); 
          Console.WriteLine(); 
         } 
         catch (Exception e) 
         { 
          Console.Error.WriteLine(e); 
         } 
        } 
    
        Console.WriteLine("Resuming Resharper"); 
        dte.ExecuteCommand("ReSharper_Resume"); 
    
        try 
        { 
         dte.Quit(); 
        } 
        catch (Exception e) 
        { 
         Console.Error.WriteLine(e); 
        } 
    
+0

Спасибо, я попробую, это выглядит здорово. У меня нет ReSharper, у меня есть VisualHG, который вмешивался в удаление проектов из текущего решения ... Я надеюсь, что это не из командной строки. – Thalia