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 :

[c#] assembly CreateInstance


Sujet :

C#

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [c#] assembly CreateInstance
    Bonsoir,

    j'ai un petit problème avec la méthode CreateInstance.
    Celle-ci retourne null.

    Voici mon code :

    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
     
            private void LoadAssemblies()
            {
                DirectoryInfo Dir = new DirectoryInfo(Initialisation.Dll);
                foreach (FileInfo File in Dir.GetFiles("*.Command.dll"))
                {
                    Assembly Assemb = Assembly.LoadFrom(File.FullName);
                    foreach (Type Typ in Assemb.GetTypes())
                    {
                        if (Typ.IsInterface == false)
                        {
                            this._map[Typ.Name] = Assemb;
                        }
                    }
                }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (this._map.ContainsKey(Commande))
                        {
                            try
                            {
                                Command Cmd = (Command)this._map[Commande].CreateInstance(Commande, true);
     
                            }
                            catch (Exception)
                            {
     
                            }
                        }
    Cmd vaut toujours null.

    Avez-vous une idee d'ou cela peut venir ?

    Merci d'avance.
    Cordialement,
    NeoKript

  2. #2
    Membre très actif Avatar de Sacha999
    Inscrit en
    Mars 2007
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mars 2007
    Messages : 294
    Par défaut
    La doc http://msdn.microsoft.com/en-us/libr...8VS.71%29.aspx indique:
    typeName
    The Type.FullName of the type to locate.
    ignoreCase
    true to ignore the case of the type name; otherwise, false.
    Essaie donc plutôt ça pour voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this._map[Typ.FullName] = Assemb;

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Le soucis n vient en fait pas d'où je pensais c'est pas create instance qui bug mais le cast de mon interface :


    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
     
    if (this._map.ContainsKey(Commande))
                        {
                            try
                            {
                                object ob = this._map[Commande].CreateInstance("ClientUser." + Commande, true);
                                if (ob is Command)
                                {
                                    Command Cmd = ob as Command;
                                    Byte[] result = Cmd.Execute(Destinataire, Commande, Content);
                                    Static.Push(result);
                                }
                            }
                            catch (Exception E)
                            {
                                String test = E.Message;
                            }
                        }
    On ne passe pas dedans if (ob is Command) ... alors que ob implémente bien l'interface Command...

    Avez vous une une idée ?

    Merci

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    remplacer
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((ob as Command) != null)
    ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut pas mieux, on ne passe pas dans le if.

    Voici mon interface si ca peut aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        interface Command
        {
            void    SetPath(String Path);
            Byte[]  Execute(String Destinataire, String Command, Byte[] Ele);
        }
    Merci

  6. #6
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Dit, on pourrai voir le code complet d'une des classes censée être chargée ? (enfin, code complet = namespace toussa, ce qu'elle fait en concret n'a pas d'importance).

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Voila pour la dll (test.Command.dll):

    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
     
    namespace ClientUser
    {
        public class DrivesExplorer : Command
        {
            private String Path = String.Empty;
            public void SetPath(String Path)
            {
                this.Path = Path;
            }
            public Byte[] Execute(String Destinataire, String Command, Byte[] Ele)
            {
                try
                {
                    String Content = String.Empty;
                    String[] drives = Environment.GetLogicalDrives();
                    for (int i = 0; i < drives.Length; i++)
                        Content += drives[i] + "\0";
                    Byte[] packet = Packet.BuildPacket(Destinataire, Command, Content);
                    return (packet);
                }
                catch (Exception)
                {
     
                }
                return (null);
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    namespace ClientUser
    {
        public interface Command
        {
            void    SetPath(String Path);
            Byte[]  Execute(String Destinataire, String Command, Byte[] Ele);
        }
    }
    et le code de chargement et appelle :

    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
     
    private void LoadAssemblies()
            {
                DirectoryInfo Dir = new DirectoryInfo(Initialisation.Dll);
                foreach (FileInfo File in Dir.GetFiles("*.Command.dll"))
                {
                    Assembly Assemb = Assembly.LoadFrom(File.FullName);
                    foreach (Type Typ in Assemb.GetTypes())
                    {
                        if (Typ.IsInterface == false && Typ.Name != "Packet")
                        {
                            String cocuou = Typ.Namespace;
                            this._map[Typ.Name] = Assemb;
                        }
                    }
                }
            }
    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
     
    if (this._map.ContainsKey(Commande))
                        {
                            try
                            {
                                object ob = this._map[Commande].CreateInstance("ClientUser." + Commande, true);
                                if ((ob as Command) != null)
                                {
                                    Command Cmd = ob as Command;
                                    Byte[] result = Cmd.Execute(Destinataire, Commande, Content);
                                    Static.Push(result);
                                }
                            }
                            catch (Exception E)
                            {
                                String test = E.Message;
                            }
                        }

  8. #8
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Pourquoi tu définis l'interface commande dans la dll ?
    Je suppose que tu as donc l'interface Command dans la dll et la même interface dans ton application de chargement, ce qui pour le runtime constitue deux interfaces complètement différente et absolument incompatibles. Il faut quand l'interface Command soit définie dans une dll référencée à la fois par l'application de chargement et la dll de la commande ...

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Mon sauveur !

    Merci bien ca me dérangeai un peu le fait que ce ne soit pas les mêmes fichiers mais je ne savais pas trop comment faire pour importer le même fichier dans les deux solutions. Avec la DLL nickel !!

    Merci encore

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    J'aurai une autre petite question, j'ai une classe qui implémente l'interface Command mais qui est dans le projet courant (pas dans une DLL), est-il possible d'obtenir "l'assembly du projet courant" afin de ne pas pas faire un traitement spécifique pour les classe qui implémente interface dans le projet ?


    Merci d'avance

  11. #11
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Assembly.GetExecutingAssembly

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Merci c'est pile ce que je voulais !

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Re-Bonjour,

    j'ai un autre petit souci, c'est qu'avec l'interface dans la dll c'est pas très pratique je pensais que quand on les ajouter en référence ba le contenue était ajouter a l'exécutable a la compilation.

    Comment puis-je faire pour n'avoir que le .exe et pas la dll de l'interface ?

    Merci d'avance

  14. #14
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Si tu exposes une interface de "Plugin", il faut à la fois qu'elle soit connue par le l'hôte et le plugin. Donc forcément, une dll commune.

    Pour faire un peut plus sport tu pourrait utiliser la reflexion pour appeler dynamiquement les méthodes de ton objet de plugin. Plus besoin de dll mais ça devient un peut plus tordu. Es-tu vraiment obligé de t'en passer ?

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

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  2. Réponses: 19
    Dernier message: 31/10/2005, 15h04
  3. [D2005]Comment utiliser des assembly développées en delphi
    Par Valéry dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 16/08/2005, 18h36
  4. Utiliser des Assembly .Net dans Visual C++ 6.0
    Par nitram dans le forum MFC
    Réponses: 1
    Dernier message: 15/06/2005, 09h05
  5. [D8] Assembly et dépendance
    Par guiguit dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 22/06/2004, 16h11

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