是否可以从命令行项目修改解决方案并使用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
谢谢
答案 0 :(得分:7)
是的,你可以。您只需要使用Visual Studio的COM CLSID激活实例。一个例子如下。它实际上创建了一个解决方案并向其添加了两个项目,但在打开现有解决方案时也适用相同的初始化
有几点需要注意:
介意COM线程模型。从控制台应用程序模板创建的代码就足够了:
[STAThread]
static void Main()
如果您安装了强大的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);
}