我想创建一个操作C#项目文件的工具

时间:2010-02-05 08:18:45

标签: c# xml msbuild

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

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

  1. 找到csproj / msbuild的XSD并创建代表项目文件的stronly类型对象。这可能吗?
  2. 是否有更好的其他工具/语言(可以用它作为学习Ruby的借口)。答案必须有一些链接到操作XML的示例。
  3. 也许真正的问题是:以编程方式阅读和操作XML的最佳方式是什么?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

我们有一个内部工具可以动态操作项目文件来更新引用并设置各种属性。由于项目文件并不复杂,我们只需直接操作XML。该工具早在LINQ可用之前编写,所以它没有使用它,但我认为没有理由你不能做Jon的建议。

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

如果您有兴趣,我在回答此问题时会对我们的工具提供更多信息Should a .sln be committed to source control?

答案 3 :(得分:2)

根据我们问题的第二部分,如何以编程方式操作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 
}

希望有所帮助