【问题标题】:Open DTE solution from another program (not add-in)从另一个程序(不是插件)打开 DTE 解决方案
【发布时间】:2013-06-08 00:50:42
【问题描述】:

是否可以从命令行项目修改解决方案并使用 envdte 工具?

我有一个可以修改解决方案的加载项。但是...一百多个项目需要更改...所以我想制作一个具有相同逻辑的c#程序,只是它遍历所有解决方案文件。

插件以

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

其中DTE2 application 是从加载项传递的...

如何获得相同的解决方案,然后我会查询项目... 从一个单独的程序中,那只会知道解决方案路径?

是否可以打开解决方案,对其进行处理,然后将其关闭 - 以继续下一个解决方案?

微软给出了这个例子http://msdn.microsoft.com/en-us/library/envdte._solution.open(v=vs.100).aspx

但我不知道上下文中的 dte 是什么...

谢谢...

VS 2010

编辑:我按照以下答案的建议做了。 稍作修改,使用链接: http://msdn.microsoft.com/en-us/library/ms228772(v=vs.100).aspx

谢谢

【问题讨论】:

    标签: visual-studio-2010 extension-methods solution envdte


    【解决方案1】:

    是的,你可以。您只需使用适用于 Visual Studio 的 COM CLSID 激活一个实例。下面是一个例子。它实际上创建了一个解决方案并向其中添加了两个项目,但是在打开现有解决方案时应用相同的初始化。

    几个注意事项:

    1. 注意 COM 线程模型。从控制台应用模板创建的代码就足够了:

      [STAThread]
      static void Main()
      
    2. 如果您安装了 ReSharper 等功能强大的 VS 扩展程序,如果您不需要它来实现 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);
          }
      

    【讨论】:

    • 谢谢,我会试试的,这看起来很棒。我没有 ReSharper,我确实有 VisualHG 干扰了从当前解决方案中删除项目......我希望它可能不是来自命令行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多