如何获得所有资源,以及创建二进制文件的副本?
我认为这是所有这样的元素(具有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文件,其中包含复制到每个项目的已编译二进制文件的资源列表。
答案 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");