2010-02-05 86 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