从另一个程序(非插件)打开DTE解决方案

3

是否可能修改一个解决方案,并从命令行项目中使用envdte工具?

我有一个插件可以修改一个解决方案。但是,这些更改对于100多个项目都是必需的... 所以我想制作一个具有相同逻辑的C#程序,只是它遍历所有解决方案文件。

插件从以下内容开始:

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

从插件传递 DTE2应用程序 ...

如何获得相同的解决方案,然后查询项目... 从一个只知道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个回答

7

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

需要注意的一些事项:

  1. Mind the COM threading model. The code created from the console app template is sufficient:

    [STAThread]
    static void Main()
    
  2. If you have a powerful VS extension like ReSharper installed, you might be better off suspending it if you don't need it for the VS automation. ReSharper had VS commands that control it.

        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,它干扰了从当前解决方案中删除项目...我希望它不会从命令行中干扰。 - Thalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接