begin process at 2010 02 09 22:17:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.NET

 > DECLARATION DYNAMIQUE D'UNE CLASSE ET D'UNE MÉTHODE DE CELLE-CI

DECLARATION DYNAMIQUE D'UNE CLASSE ET D'UNE MÉTHODE DE CELLE-CI


 Information sur la source

Note :
5,33 / 10 - par 3 personnes
5,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :.NET Source .NET ( DotNet ) Classé sous :déclaration, dynamique, méthode Niveau :Expert Date de création :03/01/2003 Date de mise à jour :09/01/2003 11:24:13 Vu :10 302

Auteur : Barz

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

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

  • // 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});
// 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...


 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) AFFICHAGE AUTOMATIQUE DES ÉVÉNEMENTS WINDOWS LIÉS AU SYSTÈME...

 Sources de la même categorie

Source avec Zip CHAT SERVER-CLIENT par abderrahmenbilog
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMULATION DE CONSOLE POUR WINDOWS MOBILE par originalcompo
Source avec Zip Source .NET (Dotnet) BASE DE DONNÉES EN XML par DanMor498
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLECONV - APPLICATION DE CONVERSION MONÉTAIRE AVEC TAUX E... par Jeffrey_
Source avec Zip Source .NET (Dotnet) TRAITEUR D'IMAGE (MINI) par ycyril

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) PANNEAUX DYNAMIQUES (MENU ASCENSSEUR) par Robert33
Source avec Zip Source .NET (Dotnet) MENUS MULTILINGUES DYNAMIQUES par william voirol
Source avec Zip Source avec une capture Source .NET (Dotnet) [WPF]LINQUERY - INTERFACE DE GESTION DE DATABASE par Nenyan
Source avec Zip Source .NET (Dotnet) MOTEUR DE PLUGINS AVEC CHARGEMENT/DÉCHARGEMENT par maitredede
Source avec Zip Source avec une capture Source .NET (Dotnet) THREAD, COMPOSANTS DYNAMIQUES, ASTUCES DE WINFORM par dadamagouil

Commentaires et avis

Commentaire de gg00xiv le 22/03/2003 01:04:29

illisible ...

Commentaire de Barz le 24/03/2003 08:55:34

C'est pas à la portée de tout le monde :-) désolé

Commentaire de gg00xiv le 12/04/2003 02:21:18

les tabulations, les sauts de lignes et les espaces ... ca mange pas de pain, et ca améliore la compréhension.

Commentaire de Barz le 14/04/2003 08:46:55

pffffff, tu as pas bien regardé le code alors, parce je vois pas ou je pourrais indenter le code. Si c'est pour mettre des commentaires de ce genre arrete tout de suite, c'est pas un forum de critique non constructive. C'est pas avec des personnes comme toi que l'on pourra avancer...

Commentaire de Ares le 03/07/2003 17:38:21

Bon travail, merci
Juste une question, et il posible de cree une instance d'une class contenu dans une dll ?

Commentaire de Barz le 27/08/2003 15:34:49

Pardon Ares, je viens juste de voir ton message. J'ai pas été prévenu du nouveau message...

La réponse est oui, mais c'est évidemment plus compliqué de l'instancier en dynamique que de l'instancier directement car il faudra que tu regardes avant en dynamique la méthode d'instanciation de la classe.

Commentaire de Ares le 28/08/2003 11:31:14

Merci, j'ai reussi

Commentaire de ZED le 11/09/2003 04:02:38

c'est ce genre d'exemples qui fais du tort au langage... autan le mettre au niv 1, car ce n'est pas un code vraiment "extraordinaire"...
mais ca reste un effort qu'il faut respecter !!!

Commentaire de facdaar le 14/11/2003 12:23:56

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.

Commentaire de lemulot le 15/02/2005 15:54:40

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.

Commentaire de alexandre7g le 11/04/2007 12:40:08

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?

Commentaire de Barz le 11/04/2007 13:10:10

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...

Commentaire de alexandre7g le 11/04/2007 14:46:43

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...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Declaration dynamique d'une classe [ par Barz ] Comment par code peut-on executer une méthode d'une classe en dynamique, c'est à dire en ayant que une chaine correspondant au nom de la classe et une Initialisation d'un tableau dynamique à deux dimensions [ par cybers7119 ] Salut à tous,J'ai un tableau à deux dimensions, qui comprendra quatre colonnes mais dont le nombre de lignes est inconnu.Je connais la méthode suivant Appel dynamique [ par chental ] salut à tous,Je fais un appel dynamique sur une méthode de ma Form.Par exemple : l'utilisateur tape : Affichage@toto Affichage est une méthode et toto Communiquer entre une winform et une méthode javascript [ par idaho121 ] Bonjour, J'ai une application C# qui travaille avec une instance d'Internet Explorer. Internet Explorer contient des ActiveX qui lèvent des événements Exploiter 2 table de la même Base dans le même prog [ par ggrug26 ] Bonjour, je rencontre un gros souci, je veux exploiter 2 table dans mon prog, je fais toutes mes déclaration en double, j'arrive a exploiter la 1ere t Linq Méthode Field<> avec type de retour inconnu [ par lemmingperceval ] BonjourJ'essaie de faire des filtres de recherche sur un dataGridView.Dès lors, j'ai une comboBox qui contient tous les champs de la table contenu dan tableau passé en paramètre d'un webservice.. [ par AmK ] Bonjour, J'ai remarqué lors de mes développements que lorsque je passe un tableau en paramètre à une webméthode , la valeur de ses éléments ne sont pa fusion de méthode ou méthode équivalente [ par ggrug26 ] bonjour,j'ai une petite question, est il possible de fusionner 2 méthode ensemble? Je vais me faire comprendre avec mon exemple:je cherche a regrouper Retour d'information dynamique [ par kikiokiller ] Bonjour,Voilà j'ai un form1 (parent) qui contient un hscrollbar et un vscrollbar accompagné d'un textbox chacun.J'ouvre un form2 (fils) et je voudrai appel de form dynamique.... [ par parlaciel ] bonjour à tous!alors je vous expose mon problème qui va certainement vous paraitre balot....Je crée une form à chaque clic sur un bouton.Mais les form


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales