2013-08-22 50 views
1

如何获取所有recources,这些拷贝到创建的二进制文件?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> 

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

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

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

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

+0

你想在运行时的资源?或编译时? – LunicLynx

+0

我只是想知道resources.I解析csproj文件,并生成与资源(路径)xml输出,要复制到二进制。 – user2545071

回答

2

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

UPDATE

这应该给怎么办与项目文件中的某些任务的总体思路。

+0

这是noob问题,但如何查看itemsToCopy的结果? (ProjectItm pr in itemsToCopy) { Consoles.WriteLine(pr.toString()); ? } – user2545071

+1

ok.just像这样:Console.WriteLine(“evaluateInclude”+ evaluateInclude); – user2545071

0

您可以通过它的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"); 
相关问题