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

问题描述 投票:0回答:3

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

对于那些不知道的人,高度简化;这是 sulution 文件 (.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,但这似乎相当复杂。

c# visual-studio-2010 serialization projects-and-solutions deserialization
3个回答
4
投票

使用 EnvDTE 库:

根据 MSDN

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

没有 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。

希望对你有帮助。


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 后面的引用(添加引用 -> 浏览选项卡):

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

所有类在 MSDN 中都有很好的文档记录。 EnvDTE 是非常强大的 VS 自动操作库,除了添加/删除之外,您还可以做更多的事情。我不会自己序列化 sln 文件,我同意发明自己的格式是不好的。


0
投票

对于任何遇到此线程的人,解决方案文件序列化器已开源:https://github.com/microsoft/vs-solutionpersistence

© www.soinside.com 2019 - 2024. All rights reserved.