【问题标题】:csproj: how to get all resources?csproj:如何获取所有资源?
【发布时间】:2013-08-24 18:12:12
【问题描述】:

如何获取所有资源,将其复制到创建的二进制文件中?

我认为都是这样的元素(有 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>

我应该像这样解析所有带有“资源”标签的元素(?):

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

还有一个问题——如何在 CopyToOutputDirectory 标签之前获取元素?

附:如果有用的话-我有项目文件夹(另一个文件夹)。 我从这个文件夹中解析所有 .csproj 文件并生成带有资源列表的 XML 文件,这些资源被复制到每个项目的编译二进制文件中。

【问题讨论】:

  • 您想要运行时的资源吗?还是编译时?
  • 我只想知道资源列表。我解析 csproj 文件并使用资源(路径)生成 xml 输出,并将其复制到二进制文件。

标签: c# xml xml-parsing csproj


【解决方案1】:

项目文件不是简单的 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;
        }

更新

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

【讨论】:

  • 这是一个菜鸟问题,但是如何查看 itemsToCopy 的结果? foreach(itemsToCopy 中的 ProjectItm pr) { Consoles.WriteLine(pr.toString()); ? }
  • ok。就像这样:Console.WriteLine("evaluatedInclude "+evaluatedInclude);
【解决方案2】:

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

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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2016-02-11
    • 2020-01-27
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多