none
Modification d'un csproj pour utiliser un préprocesseur XAML RRS feed

  • Question

  • Bonjour,

    je tente de modifier un projet WP7 afin d'en faire passer les pages XAML lié depuis un autre projet par un préprocesseur.

    Je me base sur le code de cet exemple : http://www.softaware.at/Aktuelles/2013/04/03/Sharing-XAML-between-WPF-and-WinRT. Ca fonctionne, les pages liées depuis un autre projet sont traitées par le préprocesseur (j'ai changé la task Exec donnée sur le blog par ma propre tâche).

    Cependant, je n'arrive pas à réinjecter les fichiers de sorties dans le reste du processus de compilation. De ce que j'en ai compris, c'est la partie suivante qui s'en charge.

        <ItemGroup>
          <ProcessedPages Include="@(Page->'%(Link)')" />
          <!-- Remove the original (linked) pages so that they are not compiled. -->
          <Page Remove="@(Page)" Condition="('%(Page.Link)' != '')" />
          <!-- Include the processed pages instead. -->
          <Page Include="@(ProcessedPages)" />
        </ItemGroup>

    Cela compile, mais ce n'est visiblement pas les bons fichiers qui sont pris charge dans la suite du processus puisque l'application n'est pas modifiée. En les commentant, l'application compile également et affichage la même chose.

    Comment faire sorte que l'étape de compile suivante (MarkupCompilePass1) récupère les fichiers qui ont étés générés par la tâche PreprocessorTask ?

    Pour information, voilà le fichier de projet que j'utilise : http://pastebin.com/1C1EKuw1

    lundi 13 mai 2013 00:49

Réponses

  • Ok, c'était vraisemblablement ça le problème.

    En modifiant l'itemGroup de cette façon

        <ItemGroup>
          <ProcessedPages Include="@(Page->'%(Link)')" />
          <Page Remove="@(Page)" Condition="('%(Page.Link)' != '')" />
          <Page Include="@(ProcessedPages)" />
          <Resource Remove="..\Appli2\MainPage.xaml" />
          <Resource Include="C:\Users\Louis\Desktop\temp\MainPage.xaml" />
        </ItemGroup>

    J'obtiens ce que je veux.

    C'est évidemment du hardcodé, mais à partir de ça, je vais pouvoir écrire une solution plus générique et élégante.

    Merci Aurel Bera de vous être intéressé à mon cas.

    • Marqué comme réponse Unixorn mardi 14 mai 2013 22:25
    mardi 14 mai 2013 22:25

Toutes les réponses

  • Bonjour,

    la ligne qui copie les fichiers vers C:\Users\Louis\Desktop\temp\ est juste là pour que je puisse vérifier que les fichiers aient été correctement traités. Et ils sont effectivement correctement transformés par le préprocesseur. Ce dossier n'a ensuite pas vocation a être utilisé ultérieurement.

    Tout le problème pour est de réutiliser ses fichiers pour construire l'application, au lieu des fichiers originaux.

    J'utilise essentiellement Visual Studio 2010, et un peu VS 2012. Plus exactement, je teste cela avec VS 2010 mais il faudrait que ce soit compatible avec VS 2012 aussi puisque cela sera utilisé pour compiler des projets WP8.

    edit : les fichiers .g.cs et .g.i.cs contenus dans $(IntermediateOutputPath) (c'est à dire Obj\debug\) sont visiblement correctement générés à partir de mes fichiers Xaml après transformations. Le problème est donc peut-être en rapport avec la génération du BAML
    . Bref, je cherche encore, et je commence à mieux comprendre MSBuild.
    • Modifié Unixorn mardi 14 mai 2013 21:36
    mardi 14 mai 2013 20:55
  • J'ai identifié le problème exacte : ce sont les mauvais fichiers xaml qui sont embarqués en tant que ressources dans l'application.

    Le code IL de l'assembly ne comprend effectivement qu'un champ pour le bouton2 en revanche le fichier xaml qu'il embarque comme ressource est le fichier non traité par le préprocesseur.

    Comme j'ai vu une déclaration de resources dans Microsoft.Silverlight.Common.targets qui embarque toutes les pages XAML, je pense que c'est la variable à modifier dans le processus de compilation pour que le résultat obtenu soit celui escompté.

    mardi 14 mai 2013 22:05
  • Ok, c'était vraisemblablement ça le problème.

    En modifiant l'itemGroup de cette façon

        <ItemGroup>
          <ProcessedPages Include="@(Page->'%(Link)')" />
          <Page Remove="@(Page)" Condition="('%(Page.Link)' != '')" />
          <Page Include="@(ProcessedPages)" />
          <Resource Remove="..\Appli2\MainPage.xaml" />
          <Resource Include="C:\Users\Louis\Desktop\temp\MainPage.xaml" />
        </ItemGroup>

    J'obtiens ce que je veux.

    C'est évidemment du hardcodé, mais à partir de ça, je vais pouvoir écrire une solution plus générique et élégante.

    Merci Aurel Bera de vous être intéressé à mon cas.

    • Marqué comme réponse Unixorn mardi 14 mai 2013 22:25
    mardi 14 mai 2013 22:25