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

时间:2011-11-09 11:58:35

标签: c# visual-studio-2010 serialization projects-and-solutions deserialization

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

对于那些不了解,高度简化的人;这是一个苏格兰文件(.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,但这看起来相当复杂。

2 个答案:

答案 0 :(得分:4)

使用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。

我希望它会有所帮助。

答案 1 :(得分:3)

以下是一些代码:

        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->浏览选项卡):

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

MSDN中记录了所有类。 EnvDTE是非常强大的VS自动化库,你可以做更多的事情然后添加/删除。我不打算自己编写sln文件序列,我同意发明自己的格式化是不好的。