我有一个应用程序,以编程方式创建一个visual studio解决方案,并加载我在VS2010中创建的项目和文件。我想知道如何自动保存解决方案,包括不显示保存解决方案文件对话框的项目文件。
下面的代码:Type type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
Object obj = System.Activator.CreateInstance(type, true);
EnvDTE80.DTE2 dte8Obj = (EnvDTE80.DTE2)obj;
Solution2 soln = (Solution2)dte8Obj.Solution;
Solution2 soln2 = (Solution2)dte8Obj.Solution;
Project prj;
ProjectItem prjItem;
string prjPath = @"C:SaveLocation";
string prjName = "ProjectName";
soln.Create(prjName, prjName);
soln.DTE.MainWindow.Visible = true;
string csTemplatePath = soln2.GetProjectTemplate("WebApplicationProject40.zip", "CSharp");
soln.AddFromTemplate(csTemplatePath, prjPath + prjName, prjName, false);
prj = soln.Projects.Item(1);
保存,要求输入文件名并退出…这里我想自动保存。
dte8Obj.ExecuteCommand("File.SaveAll");
dte8Obj.Quit();
刚刚转换了上面的VB。Net代码转换为c#代码由@spgennard制作
private void SaveAllFiles()
{
for (int i = 1; i <= soln.Projects.Count; i++)
{
if (!soln.Projects.Item(i).Saved)
{
soln.Projects.Item(i).Save();
}
for (int j = 1; j <= soln.Projects.Item(i).ProjectItems.Count; j++)
{
if (!soln.Projects.Item(i).ProjectItems.Item(j).Saved)
{
soln.Projects.Item(i).ProjectItems.Item(j).Save();
}
}
}
}
试试这个:
Sub SaveAllFiles()
For i = 1 To DTE.Solution.Projects.Count
If Not DTE.Solution.Projects.Item(i).Saved Then
DTE.Solution.Projects.Item(i).Save()
End If
For j = 1 To DTE.Solution.Projects.Item(i).ProjectItems.Count
If Not DTE.Solution.Projects.Item(i).ProjectItems.Item(j).Saved Then
DTE.Solution.Projects.Item(i).ProjectItems.Item(j).Save()
End If
Next
Next
End Sub
这将保存整个解决方案,解决方案中的所有项目以及所有项目文件和项:
// Get EnvDTE / DTE.
DTE dte = (DTE) GetService(typeof(DTE));
// Get the current solution.
var solution = dte.Solution;
// Save the solution file.
if(!solution.Saved)
solution.SaveAs(solution.FullName);
// Save the project files within the solution.
for(int i = 1; i <= solution.Projects.Count; i++)
{
var project = solution.Projects.Item(i);
// Check if this item is Solution Folder.
if (project.Kind == "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
continue;
if (!project.Saved)
project.Save();
// Save all the files and items within the project.
for(int j = 1; j <= project.ProjectItems.Count; j++)
{
var item = project.ProjectItems.Item(j);
if (!item.Saved)
item.Save();
}
}
指出- 为了保存溶液,我们也可以使用
SaveAs
方法覆盖当前溶液: - 您需要获得
DTE
的实例。在这里,我在我的vpackage中进入Microsoft.VisualStudio.Shell.Package
类。 - 重要: Guid
{66A26720-8FB5-11D2-AA7E-00C04F688DDE}
表示解决方案文件夹的项目类型。请参阅此链接以查看其他项目类型的指南。如果不检查解决方案文件夹并尝试保存它,Visual Studio将崩溃而不会抛出任何异常。(我在Visual Studio 2015的多个设置上测试了这个功能。)该指南可能会在未来的Visual Studio版本中更改。
EnvDTE确实是一种选择,但它完全绑定到Visual studio模型。怀疑它很老了,因为几乎所有的对象都是基于COM的,或者c#没有提供很好的api访问EnvDTE类。总之,不容易使用。
我自己开发了syncProj命令行实用程序,其中一个API,我最近介绍的,支持加载和保存解决方案文件。目前,并不是所有的解决方案的功能都支持-例如平台映射(例如x64到AnyCPU),以及源代码连接不加载或保存。
但是API/tool是MIT授权的,所以请随意把手放在上面,帮助我做得更好。
下面是一个加载.sln,修改并保存的例子:
https://github.com/tapika/syncProj/blob/master/tests/SlnToSln/TestChangeSolution.cs工具的文档可以从root readme/follow链接找到。
(如果你设法找到使用EnvDTE API的类似示例,请给我一个链接!)