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

C# Discussion :

MEF : probleme export fonction inter addin/plugin


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 21
    Points : 21
    Points
    21
    Par défaut MEF : probleme export fonction inter addin/plugin
    [VS2010][.NET4][C#4][WPF4]

    Bonjour,

    j'utilise les MEF pour mon nouveau projet à base de plugin.
    ce projet est composé de :
    HOST : l'application (exe) qui va accueillir (afficher) le plugin (view) donc qui fait la composition egalement!!
    PLUGIN_VIEW1 : plugin (dll) avec une view qui sera afficher dans HOST
    PLUGIN_LOGGER : plugin (dll) sans vue , uniquement des fonctions uqui permettent de faire du log

    plugin_logger : possède des fonctions de log, je souhaiterai exporter par exemple la fonction Log(string txt); à tous les autres plugins mais également à l'host
    exemple

    code du logger (logger.dll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    namespace Module.Tools.Logger
    {
        [Export(typeof(ILogger))]
        public class ConsoleLogger : ILogger
        {
            public void Log(string message)
            {
                Console.WriteLine(message);
            }
        }
    }
    code du contrat (contract.dll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    namespace Contract
    {
            public interface ILogger
            {
                void Log(string message);
            }
    }
    code l'host (host.exe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            CompositionContainer container ;
            public bool CheckLicences()
            {
                AggregateCatalog objCatalog = new AggregateCatalog();
                AssemblyCatalog objAssembly = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
                objCatalog.Catalogs.Add(objAssembly);
                objCatalog.Catalogs.Add(new DirectoryCatalog("Modules"));
                container = new CompositionContainer(objCatalog);
                container.ComposeParts(this);
                // ICI LOGGER EST OK il n'est pas NULL 
                Logger.Log("click check box");
            }
    code du plugin view (plugin_view.dll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public partial class PluginView : UserControl
        {
            [Import(typeof(ILogger))]
            public ILogger Logger { get; set; }
     
            public PluginView()
            {
                InitializeComponent();
                // ici logger est null après la composition
                Logger.Log("message test");
            }
        }
    comme vous le voyez précédemment lors de la composition Logger n'est pas null dans l'host mais il et null dans le plugin view.
    apparemment l'import ne fonctionne que à l'endroit ou se trouve la composition c'est à dire dans l'host...
    comment faire pour que la fonction Log soit propagé egalement au autres plugins qui sont composé..

    Merci d'avance de votre aide
    Aram

  2. #2
    Membre régulier Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Voici une réponse tardive, mais cela peut toujours servir à d'autres !

    J'ai rencontré le même problème. La solution se trouve dans Prism et son event aggregator qui permet de communiquer entre les "parts" (ou modules)

    Malheureusement, j'utlise le framework MVVM Light, et je ne voulais pas reprendre mon appli de zéro avec Prism. La solution se trouve ici où ce gentil développeur conseillé (ici) par un des créateur de prism, Glenn Block, a extrait de prism uniquement l'event aggregator et l'a rendu utilisable avec Mef.

    Par contre, la solution donnée par le tutoriel ne permet que de communiquer depuis le programme hote vers le plugin. Heuresement Glenn Block donne la solution à ce problème simplement : il faut créer une part comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        [PartCreationPolicy(CreationPolicy.Shared)]
        public class EventAggregatorPart
        {
            [Export(typeof(IEventAggregator))]
            public EventAggregator EventAggregator
            {
                get { return new EventAggregator(); }
            }
        }
    Bien lire tout les commentaires des deux liens donnés ci dessus, car ils sont aussi important que le tutoriel.

    Happy end

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

Discussions similaires

  1. Probleme d'export de package entre plugin
    Par Aragorn05 dans le forum Eclipse Platform
    Réponses: 6
    Dernier message: 19/05/2008, 17h55
  2. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  3. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  4. [VB6]Problème de fonction
    Par mustang-ffw02 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/03/2004, 15h09
  5. Probleme de fonction
    Par yenna dans le forum ASP
    Réponses: 6
    Dernier message: 01/03/2004, 14h10

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