如何通过编程保存Visual Studio解决方案?

5
我有一个应用程序,可以通过编程方式创建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();
4个回答

4

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

1
第二个for循环中应该是j++ - A-Sharabiani
1
@A-Sharabiani 已修复。 - Twometer

2
这将保存整个解决方案,包括解决方案中的所有项目、所有项目文件和项:
// 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的一个实例。在我的VSPackage中,我在Microsoft.VisualStudio.Shell.Package类中进行获取。
  • 重要提示:Guid {66A26720-8FB5-11D2-AA7E-00C04F688DDE} 表示解决方案文件夹的项目类型。请参阅此链接以查看其他项目类型的Guid。如果您不检查解决方案文件夹并尝试保存它,则Visual Studio会在不抛出任何异常的情况下崩溃(本人已在多个设置中测试了Visual Studio 2015)。这个Guid可能会在未来版本的Visual Studio中发生改变。

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

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


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