Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想创建一个处理C#项目文件的工具_C#_Xml_Msbuild - Fatal编程技术网

我想创建一个处理C#项目文件的工具

我想创建一个处理C#项目文件的工具,c#,xml,msbuild,C#,Xml,Msbuild,(基本上,我们希望在*.csproj文件的某些位置导入目标文件,否则检查该文件是否符合我们的标准) 这样做的最佳方式是什么?我计划使用C#和XDocument(LINQ到XML)并操纵节点。但这是最好的办法吗?其他备选方案可能是: 查找csproj/msbuild的XSD,并创建表示项目文件的stronly类型化对象。这可能吗 还有其他更好的工具/语言吗(它可以以此作为学习Ruby的借口)。答案必须有一些指向操作XML示例的链接 也许真正的问题是:以编程方式读取和操作XML的最佳方式是什么 我个

(基本上,我们希望在*.csproj文件的某些位置导入目标文件,否则检查该文件是否符合我们的标准)

这样做的最佳方式是什么?我计划使用C#和XDocument(LINQ到XML)并操纵节点。但这是最好的办法吗?其他备选方案可能是:

  • 查找csproj/msbuild的XSD,并创建表示项目文件的stronly类型化对象。这可能吗
  • 还有其他更好的工具/语言吗(它可以以此作为学习Ruby的借口)。答案必须有一些指向操作XML示例的链接

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

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

    我们有一个内部工具,可以动态操作项目文件以更新引用和设置各种属性。由于项目文件没有那么复杂,我们只需直接操作XML即可。这个工具在LINQ出现之前很久就已经编写好了,所以它没有使用它,但是我看不出你为什么不能按照Jon的建议去做

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


    如果您感兴趣,在我对这个问题的回答中有一些关于我们工具的更多信息

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


    希望它对您有所帮助。

    (项目文件的格式)有一个可用于此类应用程序的功能。

    您最好的选择是使用某种VS自动化。你真的不应该直接处理那些文件。@笨蛋:我不明白为什么不。它们基本上是MSBuild文件。在我看来,它们是XML(而不是不透明的二进制文件)的全部意义在于它们是可编辑的。@Jon理想情况下,我不会说“可编辑的”。当然可以。但是编辑它们可能会有问题,比如,当它们升级到VS的新版本时,除非我们讨论的是真正简单的更改。嗯,(我想)我已经看到了版本之间的不兼容。你不希望你的代码在下一个版本出现时中断。也许我混淆了不同的文件类型。无论如何,如果VS提供了一些操纵它们的方法,为什么不使用它呢?(我不是说VS提供了一种方法…。@白痴:在再次使用VS API之前,我宁愿将LINQ改为XML代码1000次。这很有效。我只是为实体数据模型的映射模式语言做了这件事,它不公开API,而且非常简单。已经有一个对象模型用于此,所以我不明白为什么要使用Linq到XML。@SayedIbrahimHashimi:当一个人不知道现有的对象模型时,而且不想去打猎:)我们也使用这个系统来处理我们的项目文件。似乎工作得很好,没有VS依赖项,这对构建机器来说是一个加号。我认为你走在了正确的道路上。如果你能更具体地说明怎么做。。。大概
     <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>
    
    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 
    }