如何以编程方式保存Visual Studio解决方案?

时间:2014-08-01 16:37:19

标签: c# envdte

我有一个应用程序以编程方式创建可视化工作室解决方案,并加载我在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);
  

save&要求输入文件名并退出...在这里我想自动保存它。

dte8Obj.ExecuteCommand("File.SaveAll");
dte8Obj.Quit();

4 个答案:

答案 0 :(得分:4)

只需将上述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();
            }
        }
    }
}

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分:1)

这将保存整个解决方案,解决方案中的所有项目以及所有项目文件和项目:

// 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 method覆盖当前解决方案:
  • 您需要获取DTE的实例。在这里,我将进入VSPackage中的Microsoft.VisualStudio.Shell.Package课程。
  • 重要:Guid {66A26720-8FB5-11D2-AA7E-00C04F688DDE}表示解决方案文件夹的项目类型。请参阅此link以查看其他项目类型的Guids。 如果您没有检查解决方案文件夹并尝试保存它,Visual Studio将崩溃而不会抛出任何异常。 (已在多个设置的Visual Studio 2015上对此进行了测试。)此Guid可能会在Visual Studio的未来版本中更改。

答案 3 :(得分:0)

EnvDTE确实是另一种选择,但它完全绑定到Visual Studio模型。怀疑它已经很老了,因为几乎所有对象都是基于COM的,或者C#无法提供对EnvDTE类的良好api访问。无论如何,都不容易使用。

我自己开发了syncProj命令行实用程序,而我最近介绍的API之一支持加载和保存解决方案文件。目前,尚不支持解决方案的所有功能-例如,未加载或保存平台映射(例如x64到AnyCPU)以及源代码连接。

但是API /工具是MIT许可的,请随时使用它,并帮助我做得更好。

这里是加载.sln,对其进行修改并保存回来的一个示例:

https://github.com/tapika/syncProj/blob/master/tests/SlnToSln/TestChangeSolution.cs

该工具的文档可从根自述文件/按照链接找到。

(如果您设法使用EnvDTE API找到类似的示例,请给我发送链接!)