2010-02-05 38 views
7

(基本上,我们希望在* .csproj的文件,有些地方导入目标文件,否则检查该文件符合我们的标准)我想创建一个工具,操纵C#项目文件

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

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

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

+0

你最好的选择是使用某种VS自动化。你真的不应该直接搞乱那些文件。 – 2010-02-05 08:20:57

+5

@Moron:我不明白为什么不。他们基本上是MSBuild文件。 IMO的整个*点*是XML(而不是不透明的二进制文件)是它们是可编辑的。 – 2010-02-05 08:29:10

+1

@Jon理想情况下,我不会说'可编辑'。可读,当然。但是编辑它们可能会有问题,例如,升级到VS的新版本时。除非我们正在谈论真正简单的改变。 – kprobst 2010-02-05 08:32:13

回答

5

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

+0

这个效果很好。我只是这样做了实体数据模型的映射模式语言,它没有公开API,而且非常简单。 – codekaizen 2010-02-05 08:33:20

+0

已经有一个对象模型,所以我不明白为什么要用Linq来代替XML。 – 2011-10-31 22:28:21

+0

@SayedIbrahimHashimi:当一个人不知道现有的对象模型,并且不想去打猎:) – 2011-10-31 22:59:04

3

我们有一个内部工具,可以即时处理项目文件以更新参考和设置各种属性。由于项目文件并不复杂,我们直接操纵XML。这个工具是在LINQ可用之前写的,所以它没有使用它,但我没有理由认为你无法做到Jon提出的建议。

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

如果你有兴趣,有我们的工具在我回答这个问题Should a .sln be committed to source control?

+0

我们也使用这个系统来处理我们的项目文件。似乎很好地工作,没有VS依赖关系,这是生成机器的一个优点。 – Pondidum 2010-02-05 09:07:23

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到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 
} 

希望它有助于

5

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

+0

我认为你是在正确的道路上。如果只有你更具体的如何做到这一点...也许http://msdn.microsoft.com/en-us/library/microsoft.build.buildengine.project_members(VS.80).aspx? – 2010-02-05 16:56:09

相关问题