2

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

我认为它是这样的所有元素(具有 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 标记之前获取元素?

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

4

2 回答 2

4

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

更新

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

于 2013-08-22T06:55:30.580 回答
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");
于 2013-08-22T07:11:43.660 回答