Convertion type classe (plugin) vers interface

sourismerdique Messages postés 19 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 21 janvier 2010 - 5 janv. 2008 à 23:24
sourismerdique Messages postés 19 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 21 janvier 2010 - 6 janv. 2008 à 13:05
Bonjour, je m'adresse à vous car j'ai un probleme de conversion de type, j'ai tenté de m'aider avec tout les bouts de code similaires trouvés sur la toile mais je ne m'en sort pas.
Mon but est simplement l'importation d'une classe provenant d'une DLL, pour cela j'ai défini une interface:

using System;
using System.Collections.Generic;
using System.Text;

namespace INTERFACE
{
    interface IO_PluginInterface
    {
        string TestMe();

        bool[] Read_DI();
        void Write_DO(bool[] outputs);

        int[] Read_AI();
        void Write_AO(int[] outputs);
    }
}

Que j'ai "implémenté" coté plugin:

using System;
using System.ComponentModel;
using System.Data;

namespace INTERFACE
{

    public class IOPluginClass : IO_PluginInterface
    {
        public IOPluginClass()
        {
        }

        public string TestMe()
        {
            return "OK";
        }

        public bool[] Read_DI()
        {
            return null;
        }
        public void Write_DO(bool[] outputs)
        {
        }

        public int[] Read_AI()
        {
            return null;
        }
        public void Write_AO(int[] outputs)
        {
        }
    }
}

Coté application Host, j'ai développé la classe suivante:
namespace INTERFACE
{
    public class IOManagement
    {

        [...]

        const string PluginPath = ".\\PLUGINS\\IO\\Plugin_core.dll";         
        FormInitializer initializer;
        Assembly PluginAssembly = null;
        IO_PluginInterface PluginInstance = null;

       //CLASS CONSTRUCTOR
        public IOManagement(FormInitializer initializer)
        {
            //initialization
            this.initializer = initializer;

            //Plugin loading
            LoadPlugin(PluginPath);
        }

        //PLUGIN LOADING
        private void LoadPlugin(string Path)
        {     
            //plugin presence check
            if (!File.Exists(Path))
            {
                initializer.AllEventsWrite("No IO plugin found");
            }
            else
            {
                try //plugin loading
                {
                    PluginAssembly = Assembly.LoadFrom(PluginPath);

                    initializer.AllEventsWrite("IO plugin loaded: " + PluginAssembly.FullName);

                    try //search interface into the plugin
                    {
                        foreach (Type ElementType in PluginAssembly.GetTypes())
                        {
                            if (ElementType.IsClass && ElementType.Name == "IOPluginClass")
                            {
                                PluginInstance = (IO_PluginInterface) Activator.CreateInstance(ElementType);
                                MessageBox.Show(PluginInstance.TestMe());
                            }
                        }

                    }
                    catch (Exception a)
                    {
                        initializer.ExeptionsEventsWrite("IO plugin class instance error " + a);
                    }
                }
                catch (Exception e)
                {
                    initializer.ExeptionsEventsWrite("IO plugin loading error " + e);
                }
            }
        }
    }
}

La ligne

PluginInstance = (IO_PluginInterface) Activator.CreateInstance(ElementType); me donne sistématiquement l'érreur suivante:

System.invalidCastExeption : Impossible d'éffectuer un cast d'un objet de type 'INTERFACE.IOPluginClass' en type 'INTERFACE.PluginInterface'.

Je ne comprends pas, j'ai trouvé quelqu'un qui avait le meme probleme avec un code très similaire, il c'est rendu compte que ses namespace n'étaient pas partout les memes, ce n'est pas mon cas.
http://www.developpez.net/forums/showthread.php?t=279373

Avez vous une idée? Merci.

8 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 janv. 2008 à 00:20
Salut,

L'interface IO_PluginInterface est définie dans un assembly référencé par l'hôte et le plugin ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
sourismerdique Messages postés 19 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 21 janvier 2010
6 janv. 2008 à 01:18
Oui, le projet plugin et le projet hote contienent tout deux le fichier IO_PlginInterface.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace INTERFACE
{
    interface IO_PluginInterface
    {
        string TestMe();

        bool[] Read_DI();
        void Write_DO(bool[] outputs);

        int[] Read_AI();
        void Write_AO(int[] outputs);
    }
}
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 janv. 2008 à 09:56
Ce qui fait qu'il s'agit de 2 types différents, ça ne peut pas marcher.

/*
coq
MVP Visual C#
CoqBlog
*/
0
sourismerdique Messages postés 19 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 21 janvier 2010
6 janv. 2008 à 12:34
Je ne comprends pas, peut tu détailler s'il te plait?

La déclaration de mon interface me sert pour que la classe de mon plugin en hérite et pour faire le cast coté host. Pourquoi 2 types différents?

Je viens d'enlever la déclaration de mon interface coté plugin ainsi que l'héritage, l'érreur reste identique.

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 janv. 2008 à 12:51
Si tu définit l'interface dans 2 assembly différents, il s'agira de 2 types différents et non pas d'un seul.
En clair, l'interface IO_PluginInterface implémentée par ta classe IOPluginClass n'est pas réellement la même que l'interface IO_PluginInterface en laquelle tu tentes le cast sur le retour de Activator.CreateInstance.

/*
coq
MVP Visual C#
CoqBlog
*/
0
sourismerdique Messages postés 19 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 21 janvier 2010
6 janv. 2008 à 12:55
Comment dois-je alors procceder?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 janv. 2008 à 13:02
Le plus simple est d'avoir les éléments communs (interfaces, etc) dans un assembly qui sera alors référencé à la fois par le plugin et par l'hote.

/*
coq
MVP Visual C#
CoqBlog
*/
0
sourismerdique Messages postés 19 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 21 janvier 2010
6 janv. 2008 à 13:05
Tu n'aurai pas un exemple à me donner sil te plait?
J'ai aucune idée de la manière de procceder
0
Rejoignez-nous