从另一个程序(不是加载项)打开DTE解决方案

时间:2013-06-08 00:50:43

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

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

我有一个修改解决方案的加载项。但是......超过一百个项目需要进行更改...所以我想制作一个具有相同逻辑的c#程序,只需迭代所有解决方案文件。

加载项以

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

从加载项传递DTE2 application ...

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

是否可以打开解决方案,处理并关闭它 - 继续下一个解决方案?

Microsoft提供了此示例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

谢谢

1 个答案:

答案 0 :(得分:7)

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

有几点需要注意:

  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);
        }