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
|
/*unsafe imperatif pour utiliser une sorte de pointeur sur classe, c'est moche, c'est comme ca...*/
unsafe static void run(string classname, string methodname)
{
//chargement dynamique de la dll
Assembly asm = Assembly.LoadFrom("C:\\Documents and Settings\\Marmotte\\Mes documents\\Visual Studio 2005\\Projects\\Library\\Library\\obj\\Release\\Library.dll");
//recuperation d'un type de la classe que l'on veut instancier
Type type = asm.GetType(classname);
//creation de l'instance de la classe objet
object objetA = Activator.CreateInstance(type);
//initialisation des types des parametres de la methode, ici (string, string, ref Classe_test)
Type[] arrTypes = new Type[3];
arrTypes.Initialize();
arrTypes.SetValue(Type.GetType("System.String"), 0);
arrTypes.SetValue(Type.GetType("System.String"), 1);
//ajout du & devrait permettre d'acceder a l'addresse de l'instance du type Classe_test.
arrTypes.SetValue(Type.GetType(type.ToString()+"&"), 2);
//mais ca ne fonctionne pas ici
//arrTypes = null aussi, bizarrement
//la ligne suivante plante : //Console.WriteLine(arrTypes.GetValue(2).ToString());
//la ligne ci dessous devrait trouver la methode Discover dans la classe Classe_test
//MethodInfo myMeth = type.GetMethod(methodname, arrTypes); //mais ne fonctionne pas!
MethodInfo myMeth = type.GetMethod(methodname);//fonctionne en revanche
//reglage des parametres
object[] arrParms = new object[3];
arrParms.SetValue("192.168.1.1", 0);
arrParms.SetValue("ERtyu=123", 1);
arrParms.SetValue(asm.CreateInstance(classname), 2);
//invoke, on sait que la methode renvoi un bool
bool success = (bool)myMeth.Invoke(objetA, arrParms);
Console.WriteLine("resultat de la discovery : {0}",success);
} |
Partager