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

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

对于那些不了解的人,高度简化; 这是一个suution文件(.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(它是?),但它看起来像是基础团队制作了自己的xml版本。 (不是恭维)

那么,无论如何,将这些对象序列化和反序列化的最佳方法是什么? 我正在考虑制作自己的IFormatter,但这看起来相当复杂。

使用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 。 当然不要忘记在解决方案文件中使用相同的项目guid。

我希望它会有所帮助。

这是一些代码:

  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文件,我同意发明自己的格式化是不好的。