DLL : importer, utiliser, etc... plusieurs dll [Résolu]

Signaler
Messages postés
46
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
5 février 2010
-
Messages postés
46
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
5 février 2010
-
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 ?

un grand merci à ceux qui pourront m'aider

Killan
www.daaboo.net

9 réponses

Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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();
}

C'est peut etre plus clair comme çà.

::|The S@ib|::
MVP C#.NET
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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.

::|The S@ib|::
MVP C#.NET
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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.

::|The S@ib|::
MVP C#.NET
Messages postés
46
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
5 février 2010

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 :)

un grand merci

Killan
www.daaboo.net
www.mizamis.be
Messages postés
46
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
5 février 2010

Je vais encore passer pour un null mais les delegates non plus je sais pas ce que c'est, décidémment il est temps que je replonge dans tout ça...

Killan
www.daaboo.net
www.mizamis.be
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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
Messages postés
46
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
5 février 2010

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)

Killan
www.daaboo.net
www.mizamis.be
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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 çà.

Pour le try catch, ca marche evidemment.

::|The S@ib|::
MVP C#.NET
Messages postés
46
Date d'inscription
jeudi 10 janvier 2002
Statut
Membre
Dernière intervention
5 février 2010

que penses-tu de ça :

obj = AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("Plugin1.dll","PluginApp.PluginClass");

est-ce bon aussi d'apres toi ?

merci,

Killan
www.daaboo.net
www.mizamis.be