【问题标题】:Serialize and Deserialize Visual Studio Solution files - or programmatically edit?序列化和反序列化 Visual Studio 解决方案文件 - 或以编程方式编辑?
【发布时间】:2011-11-09 11:58:35
【问题描述】:

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

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

【问题讨论】:

  • 使用 Visual Studio 宏怎么样?宏允许您自动化 VS IDE 中几乎所有可用的命令。我不会编辑 sln/prj 文件,因为每个 VS 版本的格式都会略有变化。
  • 现在我只需要能够编辑 vs2010 解决方案文件。而且我不认为 Visual Studio 宏会做,我将需要一个实际的类库。
  • 如果您可以确定执行机器上的 VS IDE 可用,您可以在后台打开 VS IDE 并通过 DTE 界面自动执行任务。见mztools.com/articles/2005/mz2005005.aspx
  • 任何带有完整源代码示例的最终解决方案?
  • @Kiquenet 很遗憾没有。我最终编写了自己的解析器

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


【解决方案1】:

使用 EnvDTE 库:

根据MSDNEnvDTE 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}"

记得在每个项目中使用相同的解决方案 guid。

项目文件:

这并不奇怪,它是标准的 XML 文件,您可以使用 LINQ to XML 创建/修改它。此处提供了带有示例的完整规范:http://msdn.microsoft.com/en-us/library/dd393574.aspx。当然 不要忘记使用与解决方案文件中相同的项目 guid。

我希望它会有所帮助。

【讨论】:

    【解决方案2】:

    这里有一些代码:

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

    【讨论】:

    • 这似乎不起作用:错误 1 ​​类型“EnvDTE.SolutionClass”没有定义构造函数错误 2 无法嵌入互操作类型“EnvDTE.SolutionClass”。
    • 我认为应该是 var s= EnvDte.Dte.Solution
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多