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

Développement Windows Discussion :

Utilisation de MEF


Sujet :

Développement Windows

  1. #1
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 101
    Points : 68
    Points
    68
    Par défaut Utilisation de MEF
    bonjour,
    je suis débutant en développement dotnet et pour le coup je dois développer une application extensible, qui pourra dans le futur intégrer des plugins en dotnet.
    Après quelques recherche sur le net, je me suis rendu compte qu'il y avait le framework MEF qui offrait cette possibilité, mais j'ai du mal à trouver de bon tuto.
    Est ce que quelqu'un pourrait m'expliquer justement comment faire pour découvrir à distance les plugins et les intégrer dans l'appli principale.

    Pour mon développement j'utilise VS2008SP1

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    Pour ajouter des projets de façon dynamique, c'est expliqué dans la partie 5 de l'atelier n° 4. C'est assez simple à mettre en oeuvre

    Pour les "plugins", si ma mémoire est bonne il faut regarder du côté des "addin", ça semble un peu plus complexe parce que ça se base sur des "contrats" du fait que celui qui développe le addin n'a pas forcément accès au code source de la solution elle-même (contrairement au cas précédent).

    Concernant le MEF, ça semble une solution très simple à mettre en oeuvre, mais d'après ce que j'en ai compris on en est au stade de la preview et la version finale sera intégrée au framework 4.0 et nécessitera de passer à VS2010 (celui qui a une version express, passage en douceur, pour celui qui a payé une version pro, méthode Microsoft habituelle -> tiroir caisse).

    Sous réserve que j'aie bien tout compris

    A+
    Claude

  3. #3
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 101
    Points : 68
    Points
    68
    Par défaut
    Merci pour ta réponse.
    Mais je voulais savoir de quels ateliers tu parles,certainement il me serait très utile.
    Pour le moment j'utilise VS2008 et c'est vrai que c'est un peut lourd d'inclure tout le temps dans les références la bibliothèque System.ComponentModel.Composition à la main mais c'est comme ça que j'évolue.

    Je vais aussi me tourner vers system.addin pour voir si ça ne peut pas être une solution à mon pb.

    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Mais je voulais savoir de quels ateliers tu parles,certainement il me serait très utile.
    Je parle de cet atelier ci :

    http://msdn.microsoft.com/fr-fr/vcsharp/cc950799.aspx

    Télécharge le document qui est disponible avec cet atelier, et regarde le chapitre 5.

    Moi, j'ai un projet modulaire et je référence dynamiquement mes librairies de cette façon, c'est très simple et très efficace (sauf que moi, plutôt qu'une interface, j'utilise des dérivation d'une classe abstract qui me sert de "vue").

    Tiens, je te copie le code d'instanciation de mes librairies, comme ça tu peux voir que c'est tout simple (dans ce code, "VueInterface" est la classe abstract d'où doivent dériver les classes me servant de communication) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
            private void ChercheEtInstancieCartes()
            {
                                                // PHASE 1 : TROUVER TOUTES LES DLL
                                                // --------------------------------
                List<string> files = new List<string>();            // créer une liste des dll trouvées
     
                // COMPILATION CONDITIONNELLE EN MODE DEBUG
            #if DEBUG
                // récupérer le répertoire de la solution
                var dirSolution = Directory.GetParent(Directory.GetParent(Directory.GetParent(Application.StartupPath).ToString()).ToString());
                // chercher tous les sous-directories qui s'appellent "Debug"
                var sousdirs = Directory.GetDirectories(dirSolution.ToString(), "Debug", SearchOption.AllDirectories);
     
                foreach (string dir in sousdirs)                                                    // scanner tous les sous-directories trouvés
                    if (dir.Contains(@"bin\Debug"))                                                 // si c'est bien un répertoire Debug de bin (et non de object) : GetDirectories avec @"bin\Debug" plante
                    {
                        var dlls = Directory.GetFiles(dir, "*.dll", SearchOption.TopDirectoryOnly); // récupérer toutes les dll de ce répertoire
                        if (dlls != null)                                                           // si on a trouvé des dll
                            foreach (var dll in dlls)                                               // pour chacune des dll
                                if (!dll.Contains("PublicReferences"))                              // sauf pour PublicReferences.dll (non instanciable)
                                    files.Add(dll);                                                 // ajouter la dll à la liste des fichiers trouvés
                    }
     
            // COMPILATION CONDITIONNELLE EN MODE RELEASE
            #else
                var dirPlugins = Application.StartupPath + @"\Plugins";                             // localiser répertoire des Plugins = sous-répertoire Plugins de l'application
                files = Directory.GetFiles(dirPlugins, "*.dll", SearchOption.TopDirectoryOnly).ToList<string>();  // chercher toutes les dll de ce répertoire
            #endif
     
                                                // PHASE 2 : TROUVER LES TYPES UTILES DANS LES DLL
                                                // -----------------------------------------------
                //----------------------------------------------------------------------------------------
                // Dans chaque dll on va trouver tous les types référencés (classes, enums etc). 
                // Il faut extraire les classes dérivées des vues abstraites gérées par Domogest (une seule
                // classe par projet). Ensuite on instancie la classe et on sauve l'instance dans la liste
                // concernée. On doit instancier car une classe statique ne permettrait pas l'accès aux
                // méthodes de la classe parent, la syntaxe :(
                // classederivee as classeparent).methodeclasseparent ne fonctionne pas pour les classes
                // statiques. La classe instanciée devient la classe de communication entre le projet
                // Domogest et la classe fille
                //----------------------------------------------------------------------------------------
                foreach (var dll in files)                              // pour chaque dll trouvée
                    try                                                 // nécessaire car exception si dll n'est pas une assembly dotnet
                    {
                        Assembly assembly = Assembly.LoadFrom(dll);     // charger la dll en tant qu'assembly (exception si impossible)
                        foreach (var type in assembly.GetTypes())       // pour chaque type contenu dans la dll (enums, classes etc)
                        {
                            if (type.BaseType == typeof(VueInterface))  // si on trouve une classe dérivée de VueInterface
                            {
                                interfaces.Add                          // l'instancier en tant que VueInterface et l'ajouter à la liste des interfaces
                                    (Activator.CreateInstance(type) as VueInterface);
                                break;                                  // une seule classe utile par dll
                            }
                        }
                    }
                    catch { }                                           // en principe ne devrait jamais survenir en release si on n'a pas mis
                                                                        // n'importe quoi dans le répertoire Plugins
            }
    Il y a d'autres ateliers et ils sont très instructifs.

    Je vais aussi me tourner vers system.addin pour voir si ça ne peut pas être une solution à mon pb.
    C'est une autre solution, mais c'est plus lourd à mettre en place. C'est surtout utile pour avoir une gestion du versionning des librairies, principalement lorsque ceux qui ajoutent les addins ne sont pas ceux qui ont développé le projet initial (genre ajouter des addins dans visual studio ou dans Word). Avec les addins il faut mettre en place des mécanismes d'isolation de code supplémentaires, comme les les pipelines. A toi de voir si ces fonctionnalités t'apportent un plus ou non.

    A+
    Claude

  5. #5
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 101
    Points : 68
    Points
    68
    Par défaut
    Merci pour ton aide, je vais le tester tout de suite.

Discussions similaires

  1. [Asp.MVC 2] Utilisation de MEF et partage des Models
    Par hirochirak dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 05/01/2012, 10h37
  2. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  3. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01
  4. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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