cs_Killan
Messages postés46Date d'inscriptionjeudi 10 janvier 2002StatutMembreDernière intervention 5 février 2010
-
26 déc. 2005 à 00:14
cs_Killan
Messages postés46Date d'inscriptionjeudi 10 janvier 2002StatutMembreDernière intervention 5 février 2010
-
27 déc. 2005 à 13:11
Bonjour,
pour situer le contexte, je n'ai jamais utiliser de DLL outre que faire ces propres objets et le cadre de ma question est la réalisation d'un gestionnaire graphique pour un moteur 3D modulaire et c'est ce coté modulaire qui m'envoie aux DLL
j'ai mon applic (C#) baptisée GRAK, son seul buts est de gérer des objets appelé CR.
mais vu que GRAK peut etre utilisé dans plusieurs cas, sans avoir les meme objets CR, il faut donc que ces objet soit en dehors du programme GRAK. Pour cela il lira un fichier genre XML pour savoir lequelles il doit charger et utiliser.
j'ai donc pensé que les objets CR (tous uni sous une meme interface) serait des dll chargées à la demande. malheureusement je ne sais pas comment m'y prendre ni quoi chercher (j'ai quand même regarder avant de poser ma question, mais je n'ai rien trouvé de satisfaisant )
question supplémentaire vu que les CR on la faculté de vouloir effectuer des rendu, une DLL peut-elle lié au programme qui l'a chargé, du genre que la DLL charge un fichier et envoie l'information au programme qui l'a chargé ? ou par exemple dans mon contexte qui est DX : faire des appels pour effectuer des rendu ?
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 26 déc. 2005 à 11:56
Je m'expliqe alors :
Assembly assembly = Assembly.LoadFile(file); //Le chemin vers ma dll
Type[] types = assembly.GetTypes(); //Je récupères tout les types de ma dll, a savoir les classes, les enums, les structures ....
foreach
(Type type in
types) //Pour chaque type que j'ai trouvé
{
if (type.IsAbstract || type.GetInterface(
typeof
(tonInterface).FullName) ==
null
)
continue
; //Si ton type est une classe abstraite ou implemnte pas ton interface, je passe au type suivant.
//Sinon tu instancies ton type.
toninterface moboject = (tonInterface)Activator.CreateInstance(type); //J'ai trouvé dans la dll, une classe qui implémente mon interface alors je l'instancie (equivaut a faire un new sur ma classe)
//Et je peux faire des appels comme çà
monobjet.AppelDeRendu();
}
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 26 déc. 2005 à 11:27
Assembly assembly = Assembly.LoadFile(file);
Type[] types = assembly.GetTypes();
foreach
(Type type in
types)
{
if (type.IsAbstract || type.GetInterface(
typeof
(tonInterface).FullName) ==
null
)
continue
; //Si ton type est une classe abstraite ou implemnte pas ton interface, je passe au type suivant.
//Sinon tu instancies ton type.
(tonInterface)Activator.CreateInstance(type);
}
Moi je me sers de ce petit bout de code pour gérer un pool de plugins que je stocke dans une hashtable personnalisée. Mes dll sont instanciée et stocké dans cette Hashtable. C'est une manière simple non paramétrée, tu peux avoir plusieurs type de binding, tu comprenderas quant tu en auras besoins.
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 26 déc. 2005 à 11:29
Pour les rendus, il suffit que tu es un framework commun à l'application et à la DLL. Sinon la manière la plus élégante est de passer un délegate à ta classe instancié. Ce délégate représentera ta fonction de rendu.
cs_Killan
Messages postés46Date d'inscriptionjeudi 10 janvier 2002StatutMembreDernière intervention 5 février 2010 26 déc. 2005 à 11:34
Merci dit
pour les rendu je n'ai pas de prob :) j'utilise DX et le framework c'est justement ce que j'essaie de bidouiller pour faire ma propre base.
c'est justement ce que je cherchais cette histoire de plugins, on vois que tu parles en connaissance de cause car j'ai du mal à te suivre lol. (je ne suis pas un grand programmeur C#, j'y touche à peine)
je vais donc regarder pour piger les paramètres que je ne comprend pas, car les assembly je n'ai jamais touché et ce genre de code m'est inconnu :) je vais donc chercher :)
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 26 déc. 2005 à 11:52
Si tu as fait du C++ ca ressemble de loin à des pointeurs de fonctions. Tu passes en paramètres de ta classe ou ta fonction, une référence vers ta fonction. Rien ne vaut un exemple fait avec snippet compiler :
using System;
using System.Collections;
public class MyClass
{
//Ici je déclare un délegate avec cette signature.
public delegate void delegatederendu(int a, int b);
public static void Main()
{
RL(); //Readline.
//Je passe en paramètre de ma classe une reference vers ma fonction de rendu qui respecte la signature du delegate de dessus.
MyClass mc = new MyClass(new delegatederendu(Rendu));
RL();
}
//L'implementation de mon delegate qui sera passé en paramètre de ma classe.
public static void Rendu(int a, int b)
{
WL(a.ToString() + ' ' + b.ToString()); //Writeline
}
//Le constructeur qui reçoit en parametres la fonction correspondante.
public MyClass(delegatederendu fonctionrendu)
{
//Appel de la fonctionrendu qui en fait pointe sur la fonction Rendu
fonctionrendu(5, 6);
}
}
A noter que je travaille sur un fichier unique mais ca marche bien evidemment partout.
::|The S@ib|::
MVP C#.NET
cs_Killan
Messages postés46Date d'inscriptionjeudi 10 janvier 2002StatutMembreDernière intervention 5 février 2010 26 déc. 2005 à 12:05
Ha ça j'ai compris
fallais juste quelques commentaires en plus et je comprend beaucoup mieux !
donc je peu écrire mon objet, en faire une DLL (chercher comment faire), tester, debugger
Super, un grand merci
y a t il des précautions à prendre quand au déchargement du programme, faut-il preciser un "unload" sur les DLL chargée ?
la DLL peut elle renvoyer des exceptions que l'on pourrait catcher dans le programme qui a chargé la DLL, comme ça en cas de problème c'est plus pratique. (surement encore une bete question)
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 26 déc. 2005 à 12:35
Non pour les précautions , la fin de ton thread terminera celui du chargement des assemblies. Le gaabage collector se charge du reste, après tu peux forecer les choses , mais déjà essaie de te dépatouiller avec çà.