Declaration dynamique d'une classe et d'une méthode de celle-ci

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 910 fois - Téléchargée 28 fois

Contenu du snippet

Pour construire des applications qui s'adaptent aux évolutions des assemblages, rien de tel que le dynamique.
Cela permet par exemple d'appeller une méthode commune à plusieurs classes en donnant par saisie d'une chaine le nom de la classe.

Différentes versions sont décrites ci-dessous. Ne pas oublier d'ajouter
le namespace System.Reflection : using System.Reflection;

Les objets utilisés sont à découvrir plus précisément par vous-même, ils permettent de parcourir notamment tout le contenu d'un assemblage...

Source / Exemple :


// Version longue pour un assemblage qui est externe mais local (.dll)
// aucune référence et using n'est nécessaire. Ne marche pas pour
// un assemblage dans le gac
Assembly v_Assembly=Assembly.Load("Namespace1");
Module v_Module=v_Assembly.GetModule("Namespace1.dll");
Type v_Type=v_Module.GetType("Namespace1." + ClasseConcernee,true,false);
MethodInfo v_metInfo=v_Type.GetMethod("Method1");
Object[] v_tabParameters=new Object[] {Liste des paramètres};
v_metInfo.Invoke(v_Type,v_tabParameters);

// Version courte pour un assemblage qui est externe mais local (.dll)
// aucune référence et using n'est nécessaire. Ne marche pas pour
// un assemblage dans le gac
Type v_Type=Assembly.Load("Namespace1").GetModule("Namespace1.dll").GetType("Namespace1." + ClasseConcernee,true,false);
v_Type.GetMethod("Method1").Invoke(v_Type,new Object[] {Liste des paramètres});

// Version pour un assemblage externe mais référéncé et
// avec un using dans la classe en question.
// L'avantage de celui-ci est qu'il prend en compte un assemblage local
// ou dans le gac.
Assembly[] v_CurrentAssemblies=AppDomain.CurrentDomain.GetAssemblies();
// Recherche de l'assemblage que l'ont veut utiliser
// parmi les assemblages utilisés actuellement
foreach (Assembly v_Assembly in v_CurrentAssemblies)
 {
 if (  v_Assembly.FullName.StartsWith("Namespace1") )
  {
   // L'assemblage a été trouvé, execution de notre méthode
   Type v_Type=v_Assembly.GetType("Namespace1." + ClasseConcernee,true,false);
   v_Type.GetMethod("Import").Invoke(v_Type,new Object[] {Liste des paramètres});
   break;
   }
  }

// Pour l'assemblage courant
// et même nom de namespace
Type v_Type=Type.GetType(ClasseConcernee,true,false);
v_Type.GetMethod("Method1").Invoke(v_Type,new Object[] {Liste des paramètres});

Conclusion :


Il existe énormément de manière pour lancer dynamiquement
une classe, seul une petite partie est montrée ici...

A voir également

Ajouter un commentaire

Commentaires

alexandre7g
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007
-
Ok donc si tout vient du .Net le C++ Managé doit résoudre ce pb.J'essai et je vous dis ce que ca donne...
cs_Barz
Messages postés
12
Date d'inscription
vendredi 28 septembre 2001
Statut
Membre
Dernière intervention
18 décembre 2008
-
Ce code a été la base pour faire un explorateur et testeur de dll faites en .net (Pour les tests c'est très utile le dynamique et cela évite une autre réécriture de code pour le test seulement...)
Malheureusement je ne pense pas que cela puisse marcher sur une dll faite en c++ non .net car les dll .net ont une partie manifest en plus qui permet d'obtenir la liste des méthodes et je pense que System.Reflection se base sur cette partie manifest. Comme elle n'existe pas sur une dll non .net cela me parait logique que tu puisse instancier la dll et logique le fait que cela ne te trouve pas de méthode .NET
Sauf avis contraire car je n'ai pas la science infuse loin de là, pour faire du dynamique sur une dll en c++ il faudra que tu passe par un autre moyen sorry...
alexandre7g
Messages postés
11
Date d'inscription
mercredi 14 mars 2007
Statut
Membre
Dernière intervention
20 novembre 2007
-
J'ai un petit problème...
Je m'inspire que ce qui est fait ici pour aller chercher des méthodes dans une DLL en C++:est ce compatibles?
J'arrive à créer une instance,trouver le type mais pas de méthode (recherche avec son nom)...des idées?
cs_lemulot
Messages postés
5
Date d'inscription
jeudi 17 avril 2003
Statut
Membre
Dernière intervention
24 novembre 2005
-
Ouin, le fait est que le code aurait pu être mieux présenté, mais y en a tout de même pas pour 10 pages !

Bon travail.
facdaar
Messages postés
64
Date d'inscription
lundi 24 mars 2003
Statut
Membre
Dernière intervention
23 février 2009
-
C'est qd même un code intéressant, ça peut toujours servir d'utiliser un chargement dynamique, même si ça me parait dangereux.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.