2013-08-22 5 views
1

Comment obtenir toutes les ressources, quelles sont les copies à créer binaire?csproj: comment obtenir toutes les ressources?

Je pense que ce sont tous des éléments comme celui-ci (a tag CopyToOutputDirectory):

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

et comme celui-ci:

<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> 

et je parse tous les éléments avec le tag "ressources" comme celui-ci (?):

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

Et une autre question - comment obtenir l'élément avant le tag CopyToOutputDirectory?

P.S. si c'est utile, j'ai un dossier avec des projets (un autre dossier). J'analyse tous les fichiers .csproj de ces dossiers et génère le fichier XML avec la liste des ressources qui ont été copiées dans le binaire compilé de chaque projet.

+0

Voulez-vous les ressources au moment de l'exécution? ou Compile-temps? – LunicLynx

+0

Je veux juste savoir la liste des ressources. J'analyse le fichier csproj et génère la sortie xml avec resourses (chemin), qui copie en binaire. – user2545071

Répondre

2

Les fichiers de projet sont NOT fichiers XML simples, ils peuvent contenir une logique qui doit être évaluée.

Vous pouvez y parvenir en utilisant l'assembly Microsoft.Build et l'espace de noms 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; 
     } 

MISE À JOUR

Cela devrait donner une idée générale comment faire certaines tâches avec les fichiers de projet.

+0

c'est une question noob, mais comment voir le résultat de itemsToCopy? foreach (ProjectItm pr dans itemsToCopy) { Consoles.WriteLine (pr.toString()); ? } – user2545071

+1

ok.Juste comme ceci: Console.WriteLine ("evaluateInclude" + évaluéInclude); – user2545071

0

Vous pouvez obtenir l'élément parent de la propriété CopyToOutputDirectory via sa propriété Parent. N'oubliez pas non plus d'obtenir les ressources qui sont copiées si elles sont plus récentes:

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