【问题标题】:How to programmatically save Visual Studio solution?如何以编程方式保存 Visual Studio 解决方案?
【发布时间】:2014-08-01 16:37:18
【问题描述】:

我有一个以编程方式创建 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();

【问题讨论】:

    标签: c# envdte


    【解决方案1】:

    只需将上面的 VB.Net 代码转换为 @spgennard 制作的 C# 代码

    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();
                }
            }
        }
    }
    

    【讨论】:

    • 在第二个 for 循环中应该是 j++
    • @A-Sharabiani 解决了这个问题
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      // 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 以查看其他项目类型的指南。 如果您不检查解决方案文件夹并尝试保存它,Visual Studio 将崩溃而不会引发任何异常。 (已在 Visual Studio 2015 上对多个设置进行了测试。)此指南可能会在 Visual Studio 的未来版本中发生变化。

      【讨论】:

        【解决方案4】:

        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 的类似示例,请发给我一个链接!)

        【讨论】:

          猜你喜欢
          • 2010-12-15
          • 1970-01-01
          • 2017-08-15
          • 1970-01-01
          • 2015-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-03
          相关资源
          最近更新 更多