【问题标题】:I want to create a tool that manipulates C# project files我想创建一个操作 C# 项目文件的工具
【发布时间】:2010-02-05 22:50:29
【问题描述】:

(基本上我们想在 *.csproj 文件的某些地方导入目标文件,否则检查文件是否符合我们的标准)

这样做的最佳方法是什么?我打算使用 C# 和 XDocument (LINQ to XML) 并操作节点。但这是最好的方法吗?其他替代品可能是:

  1. 找到 csproj/msbuild 的 XSD 并创建代表项目文件的 stronly 类型对象。这可能吗?
  2. 是否有其他更好的工具/语言(可以以此为借口学习 Ruby)。答案必须有一些指向用于操作 XML 的示例的链接。

也许真正的问题是:以编程方式读取和操作 XML 的最佳方式是什么?

【问题讨论】:

  • 您最好的选择是使用某种 VS 自动化。你真的不应该直接弄乱这些文件。
  • @Moron:我不明白为什么不这样做。它们基本上是 MSBuild 文件。 IMO 的全部 point 它们是 XML(而不是它们是不透明的二进制文件)是它们是可编辑的。
  • @Jon 理想情况下我不会说“可编辑”。可读,当然。但是当他们升级到新版本的 VS 时,编辑它们可能会有问题。除非我们谈论的是非常简单的改变。
  • 好吧,(我认为)我已经看到版本之间的不兼容。您不希望您的代码在下一个版本发布时中断。也许我对不同的文件类型感到困惑。无论如何,如果 VS 提供了一些操作它们的方法,为什么不使用它呢? (不是我说 VS 提供了一种方法……)。
  • @Moron:在再次使用 VS API 之前,我宁愿将 LINQ to XML 代码更改 1000 次。

标签: c# xml msbuild


【解决方案1】:

我个人会直接使用 LINQ to XML...除非您正在执行非常繁重的处理,否则我认为不值得为其创建对象模型。这个工具到底需要多少规则/什么?

【讨论】:

  • 这很好用。我只是为实体数据模型的映射模式语言做了这个,它不暴露 API,而且非常简单。
  • 已经有一个对象模型,所以我不明白为什么要使用 Linq to XML。
  • @SayedIbrahimHashimi:当一个人不了解现有的对象模型并且不想去狩猎时:)
【解决方案2】:

MSBuild(这是项目文件的格式)有一个 object model,您可以将其用于此类应用程序。

【讨论】:

【解决方案3】:

我们有一个内部工具,可以即时操作项目文件以更新参考并设置各种属性。由于项目文件并不复杂,我们只需直接操作 XML。该工具是在 LINQ 可用之前很久编写的,因此它不使用它,但我看不出你为什么不能按照 Jon 的建议去做。

当我们从 VS2005 升级到 VS2008 时,我们只需要对代码进行细微的调整,但当然这方面并不能保证。我们可能需要对未来的版本进行更大的调整。

如果您有兴趣,在我对这个问题的回答Should a .sln be committed to source control? 中有更多关于我们工具的信息

【讨论】:

  • 我们也将这个系统用于我们的项目文件。似乎运行良好并且没有 VS 依赖项,这对构建机器来说是一个加分项。
【解决方案4】:

根据我们如何以编程方式操作 XML 的问题的第二部分,这里是来自项目配置文件的一些 xml。 (web.config)

 <system.web>
<compilation debug="false">
<assemblies>
        <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, 
</compilation>
</compilation>

并使用 LINQ-TO-XML 进行解析,如下所示

XDocument assemblies = XDocument.Parse("web.config");

var projectAssemblies= from a in assemblies.Descendants("system.web\assemblies")
               select new  // What ever object you waant
               {
                   Assembly = a.Attribute("assembly").Value.ToString(),
                   Version = a.Attribute("Version").Value.ToString(),
                   Culture = a.Element("Culture").Value.ToString(),
                   PublicKeyToken = a.Attribute("PublicKeyToken").Value.ToString()
               };

foreach (var v in projectAssemblies)
{
    // enjoy them 
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多