csproj:如何获得所有资源?

时间:2013-08-22 06:34:16

标签: c# xml xml-parsing csproj

如何获得所有资源,以及创建二进制文件的副本?

我认为这是所有这样的元素(具有CopyToOutputDirectory标记):

<ItemGroup>
 <None Include="Configs\Config.config">
   <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 </None>
</ItemGroup>

并且像这样:

<ItemGroup>
<Resource Include="Resources\Icons\icon4.png" />
</ItemGroup>
<ItemGroup>
  <Resource Include="Resources\Icons\icon5.png" />
</ItemGroup>
<ItemGroup>
  <Resource Include="Resources\Icons\icon6.png" />
</ItemGroup>
<ItemGroup>
  <Resource Include="icon7.ico" />
</ItemGroup>
<ItemGroup>
  <Resource Include="Resources\Icons\icon8.png" />
</ItemGroup>

我应该使用标签“Resource”解析所有元素,如下所示(?):

XDocument doc = XDocument.Load(filePath);
        IEnumerable<XAttribute> attr = doc.Descendants().Attributes("Resource");

另一个问题 - 如何在CopyToOutputDirectory标记之前获取元素?

P.S。如果它有用 - 我有项目的文件夹(另一个文件夹)。 我解析这个文件夹中的所有.csproj文件,并生成XML文件,其中包含复制到每个项目的已编译二进制文件的资源列表。

2 个答案:

答案 0 :(得分:2)

项目文件是 NOT 简单的XML文件,它们可以包含需要评估的逻辑。

您可以使用Microsoft.Build程序集和Microsoft.Build.Evaluation命名空间来实现此目的。

var project = new Project(@"..\..\StackOverflow.csproj");

        var itemsToCopy = new List<ProjectItem>();

        var projectItems = project.Items;
        foreach (var projectItem in projectItems)
        {
            // e.g get all elements with CopyToOutputDirectory == "Always"
            var projectMetadata = projectItem.GetMetadata("CopyToOutputDirectory");
            if (projectMetadata != null && projectMetadata.EvaluatedValue == "Always")
                itemsToCopy.Add(projectItem);
        }

        foreach (var projectItem in itemsToCopy)
        {
            // e.g get then Include-Attribute from <None Include="Configs\Config.config">
            var evaluatedInclude = projectItem.EvaluatedInclude;
        }

        // get the resources that are not set to CopyToOutputDirectory == "Always"
        var collection = project.GetItems("Resources");
        var resources = collection.Except(itemsToCopy);
        foreach (var projectItem in resources)
        {
            // e.g get then Include-Attribute from <Resource Include="Resources\Icons\icon8.png" />
            var evaluatedInclude = projectItem.EvaluatedInclude;
        }

<强>更新

这应该大致了解如何使用项目文件执行某些任务。

答案 1 :(得分:0)

您可以通过CopyToOutputDirectory属性获取Parent标记的父元素。另外,不要忘记获取更新的资源:

XDocument xdoc = XDocument.Load(filePath);
var resources = from r in xdoc.Descendants("Resource")
                select (string)r.Attribute("Include");

var copiedContent = from c in xdoc.Descendants("CopyToOutputDirectory")
                    where (string)c == "Always" || (string)c == "PreserveNewest"
                    select (string)c.Parent.Attribute("Include");