序列化和反序列化Visual Studio解决方案文件-或以编程方式编辑

本文关键字:编程 方式 编辑 文件 反序列化 Visual Studio 解决方案 序列化 | 更新日期: 2023-09-27 18:13:51

我想以编程方式添加和删除项目,解决方案文件夹和其他项目,如解决方案的资源文件,但我不确定什么是最好的方法。

对于那些不知道的,高度简化;解决方案文件(.sln)通常是这样的:

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "project name", "projectpath'name.csproj", "{785ECC80-AF1B-4FBC-B97B-2EC43B7E81E8}"
EndProject
Global
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {785ECC80-AF1B-4FBC-B97B-2EC43B7E81E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
    EndGlobalSection
EndGlobal

我不确定这是不是一个真正的开放标准,比如xml(它是吗?),但它看起来像是visual basic团队制作了自己的xml版本。(不是恭维)

无论如何,对对象进行序列化和反序列化的最好方法是什么?我正在考虑制作自己的IFormatter,但这似乎相当复杂。

序列化和反序列化Visual Studio解决方案文件-或以编程方式编辑

使用EnvDTE库:

根据MSDN EnvDTE is an assembly-wrapped COM library containing the objects and members for Visual Studio core automation.,您还可以找到SolutionProject接口的文档,并使用示例,这应该非常有帮助。

没有EnvDTE库:

解决方案文件:

似乎这里没有太多要做的-添加一个项目和设置构建配置。在我看来,最好的方法是使用简单的TextReader解析它,并在添加一些数据后重写它。这是模板。

Project("{solution guid}") = "project name", "projectpath'name.csproj", "{project guid}"

记住在每个项目中使用相同的解决方案指南。

项目文件:

这里不奇怪,它是一个标准的XML文件,您可以使用LINQ to XML创建/修改它。完整的规范和示例可在这里:http://msdn.microsoft.com/en-us/library/dd393574.aspx。当然不要忘记使用与解决方案文件中相同的项目指南。

代码如下:

        using EnvDTE;
        .....
        Solution s = new SolutionClass();
        s.Open(solutionFilePath);
        s.AddFromFile(projectFilePath);
        s.Remove(s.Projects[6]);

您可以像在foreach(var project in s.Projects)中一样导航项目,并检查它们的project.Name属性以找到您想要的项目。

添加到引用下面的dll (AddReference->Browse选项卡):

C:'Program Files (x86)'Microsoft Visual Studio 10.0'Common7'IDE'PublicAssemblies'EnvDTE.dll.

所有类在MSDN中都有很好的文档。EnvDTE是一个非常强大的VS自动化库,你可以做比添加/删除更多的事情。我不会麻烦自己序列化sln文件,我同意发明自己的格式是不好的。