IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

Lier des fichiers sources dans plusieurs assemblies


Sujet :

Framework .NET

  1. #1
    Membre régulier Avatar de despeludo
    Inscrit en
    Janvier 2004
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 121
    Points : 83
    Points
    83
    Par défaut Lier des fichiers sources dans plusieurs assemblies
    Bonjour à tous !

    Dans une solution Visual Studio, la situation est la suivante :
    D'un côté j'ai un ensemble de fichier sources S, pour l'instant inclus dans un projet de bibliothèque de classes.

    L'idée est que chacun de ces projets P fait appel à du code des sources S. Pour autant, pour certaines bonnes raisons, je ne souhaite pas rassembler ces sources S au sein d'une assembly. De plus je ne souhaitevévidemment pas dupliquer les sources dans chacune des assemblies. (Euh vous me suivez jusque là ?).

    En furetant sur le net, j'ai trouvé une solution potentielle qui consisterait à générer un ou plusieurs .netmodule à partir des sources S et de les lier à chacun des différents projets P.

    Pour le moment j'ai un peu bidouillé le fichier csproj des sources S pour que VS me génère un .netmodule.

    Maintenant comment faire pour que le fichier .netmodule soit pris en charge par mes différents projets P ? Ou alors existe-t-il une autre solution permettant de répondre à mon problème initial ?

    Merci d'avance pour vos réponses.

    PS: Pour information, j'utilise VSTS 2008
    Un ordinateur fait ce qu'on lui demande, et c'est bien le problème.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    le probleme etant que VS (le 2005 sur, le 2008, je n'ai pas encore testé mais ce ne m'etonnerai pas) ne sait pas gerer les assembly multi-module, tu dois faire la compilation à la mimine en ligne de commande (/addmodule ... ) pour ajouter ton module à chacun de tes assemblies.

    La generation d'une DLL faciliterai enormement les choses, mais apparement, tes contraintes t'en empechent. Vu que tu arrives deja à generer ton module, tu as eviter le gros probleme de la reference circulaire, pour le reste il te suffit de recompiler tout ca en ligne de commande (le module + le reste de schmilblik et ca devrait rouler).

    Infos (peut etre) utiles.

    Bon courage.

  3. #3
    Membre régulier Avatar de despeludo
    Inscrit en
    Janvier 2004
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 121
    Points : 83
    Points
    83
    Par défaut
    Merci pour ta réponse mais malheureusement cela ne répond pas complètement à mon besoin (J'avais déjà vu ce lien).

    En fait en furetant un peu plus j'ai vu que l'on pouvait inclure les directives AddModule dans les fichiers csproj des projets P mais bon de toutes façons il n'aurait pas été possible d'avoir l'intellisense relative aux sources S dans ce projet.

    Du coup je me suis orienté vers une autre solution qui permet de répondre à ma double problématique Déploiement d'assembly et Intellisense.
    Pour ceux que cela peut intéresser le principe consiste à compiler les fichiers sources S sous la forme d'une assembly de manière à pouvoir profiter de l'intellisense. Maintenant, concrètement, ce que l'on cherche à faire est à merger les deux assemblies. Pour ce faire, il existe un utilitaire distribué par Microsoft qui s'appelle ILMerge disponible gratuitement ici.

    Pour rendre son utilisation automatique, il faut néammoins faire un petit peu de travail à la mimine dans le fichier csproj :

    Tout d'abord il faut identifier les assemblies qui devront être liées statiquement. Ceci peut être fait en ajoutant un marqueur à une assembly liée. Par exemple, dans une section telle que celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        <ProjectReference Include="..\BaseModule\BaseModule.csproj">
          <Project>{7088D1AA-6CA2-4FCF-BF7E-F857BDEDB2F5}</Project>
          <Name>BaseModule</Name>
        </ProjectReference>
    Rajouter un attribut ILMerge ayant la valeur True, ce qui nous donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <ProjectReference Include="..\BaseModule\BaseModule.csproj">
          <Project>{7088D1AA-6CA2-4FCF-BF7E-F857BDEDB2F5}</Project>
          <Name>BaseModule</Name>
          <ILMerge>True</ILMerge>
        </ProjectReference>
    Ensuite, on va demander après la compilation de chaque assembly, on va demander au compilateur de parcourir l'ensemble des assemblies référencées et devant être copiées localement (on ne va pas tenter de lier les assemblies du framework quand même ) et de lier celles qui ont l'attribut ILMerge à True. Ceci se fait dans la section AfterBuild comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      <Target Name="AfterBuild">
        <CreateItem Include="@(ReferencePath)" Condition="'%(CopyLocal)'=='true' and '%(ReferencePath.IlMerge)'=='true'">
          <Output TaskParameter="Include" ItemName="IlmergeAssemblies"/>
        </CreateItem>
     
        <Message Text="MERGING: @(IlmergeAssemblies->'%(Filename)')" Importance="High" />
        <Exec Command="&quot;$(ProgramFiles)\Microsoft\Ilmerge\Ilmerge.exe&quot; /out:@(MainAssembly) &quot;@(IntermediateAssembly)&quot; @(IlmergeAssemblies->'&quot;%(FullPath)&quot;', ' ')" />
      </Target>
    Au passage, vous remarquerez que MsBuild nous informera de l'ensemble des assemblies liées en affichant un pessage "MERGE BaseModule.dll", ce qui est plus propre.

    Et voilà.

    Maintenant pour les plus fénéant qui n'auraient pas envi de retaper cette section dans l'ensemble des projets, il est tout a fait possible de créer un fichier targets que nous incluerons en référence dans le fichier csproj.
    Un ordinateur fait ce qu'on lui demande, et c'est bien le problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2014, 22h31
  2. ouvrir des fichiers source dans l'éditeur
    Par php_faboul dans le forum NetBeans Platform
    Réponses: 7
    Dernier message: 04/05/2011, 21h45
  3. Réponses: 15
    Dernier message: 16/01/2009, 00h16
  4. Réponses: 1
    Dernier message: 13/10/2008, 08h17
  5. Réponses: 3
    Dernier message: 23/05/2007, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo