3

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

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

加载项以

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

DTE2 application加载项传递的位置...

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

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

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

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

谢谢...

对比 2010

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

谢谢

4

1 回答 1

7

是的你可以。您只需使用适用于 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);
        }
    
于 2013-06-10T05:55:35.863 回答