[.Net] Création de DLL et double chainage

Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 - 17 août 2005 à 14:25
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 - 18 août 2005 à 11:39
Bonjour à tous !

J'ai un problème pas forcément évident à expliquer, donc je me suis donné la peine de faire un schéma pour vous l'expliquer.

Le voici :





Ce schéma correspond à mon architecture applicative.

Mon idée, qui en soit n'est pas plus compliqué que cela, était de
générer une DLL pour le package contenant les classes
FonctionsDisponibles, Fonction et toutes les classes héritant de cette
derniere classe. De cette manière, lorsque je code une nouvelle
fonction, pour qu'elle puisse être disponible à l'utilisation dans mon
application, je n'ai juste -en théorie- qu'a recompiler ma dll avec la
nouvelle Fonction, et la méthode getFonctionsDisponibles() mise à jour,
et c'est bon.



Le porblème maintenant, vient de ma classe GestionnaireFonctions qui
est utilisée par mes classes de ma DLL... Pour l'instant, pas de
problèmes ... Le problème arrive à cause du fait que
GestionnaireFonctions utilise la méthode
FonctionsDisponibles.getFonctionsDisponibles() ... j'ai donc un linkage
"dans les deux sens".



Je dis tout de suite que je ne peux pas incorporer la classe
GestionnaireFonctions dans ma DLL : en effet, comme vous pouvez le
voir, cette classe utilise plein d'autres classes (qui elles-memes
utilisent d'autres classes etc...) et est également utilisée par plein
d'autres classes (je viens de m'apercevoir que je ne l'ai pas
schématisé ... tant pix ! ^_^) donc ca ne s'arrete plus ...



Je voulais savoir s'il était possible, sous .Net, de générer plusieurs
DLL à partir d'un projet (en spécifiant quelles sources vont dans
quelles DLL par exemple) ou s'il existe un procédé permettant de
générer mes DLL "croisées".



Merci d'avance :)

18 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
17 août 2005 à 14:45
je pense que, pour éviter ton problème de redondance, qu'il te faudrait une interface entre les 2...


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 14:58
Le probleme est que ma fonction "utilisée" par le GestionnaireFonctions
est static .... et il est bien connu (malheureusement) qu'on ne peut
définir de méthode static abstraite (ou d'interface avec une méthode
statique)

Maintenant, placer une interface au dessus de mon GestionnaireFonctions
... pourquoi pas -éventuellement- ... le probleme est que si je dois
voir mon GestionnaireFonctions évoluer, il va falloir que je fasse
évoluer mon interface pour pouvoir accéder a "l'évolution" dans mes
Fonctions ... lourd ! :) (j'suis une grosse feignasse ^_^)



je suis ouvert a toute nouvelle suggestion ^_^
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 15:31
Je pense qu'à y réfléchir un peu plus ... je pourrais en fait très bien
utiliser un singleton plutot qu'une classe avec simplement une méthode
statique pour la classe FonctionsDisponibles ... pourquoi pas =)
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
17 août 2005 à 15:46
c'est une solution qui me parait correcte


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 août 2005 à 16:07
Est-ce-que la réflexion ne serait pas une solution, envisager un scenario avec ce qu'on appele je crois "un lien tardif" ?
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 16:21
J'y ai également pensé mais je ne sais absolument pas comment mettre ca en place ^_^
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
17 août 2005 à 16:24
une réponse bien de chez moi : "oui et non"

en fait avec la réflection, le problème c'est de savoir quelles méthodes on peut utiliser...

en fait, j'aime la notion de "plug in"... avec x classe implémentant la même interface, ca permet de créer un lien tardif et d'utiliser LA bonne méthode.

ex :
public interface IFonction {
string Name;
string Description;
void Action(object[]);
void BeginAction(object[]);
void EndAction();
}

ensuite pour chaque fonction, c'est comme si tu créés un plugin implémentant l'interface.

c'est une idée... je pense utiliser ce principe bientot dans une application de traitement d'images.


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 16:42
hihi ... j'ai l'impression de me mordre la queue (aie ca fait mal !) ...



Je viens d'implémenter mon singleton ainsi que l'interface ... mais subsiste encore un probleme :

auparavant, dans mon GestionnaireFonctions, j'avais un truc du style :



{

//...

_fonctionsConnues = FonctionsDisponibles.initFonctionsConnues(this, /* ... */);

// ...

}



... Mais maintenant... que dois-je mettre ?

Puisque "normalement", dans le code du Gestionnaire, je ne suis pas
censé "connaitre" la classe FonctionsDisponibles (je connais par contre
l'interface IFonctionsDisponibles)



Ce que je veux dire, c'est que l'instance de FonctionsDisponibles, il
va bien falloir que je la passe en parametre quelque part...

Un pattern de derriere les fagots pour ca ? ^^
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 août 2005 à 16:53
Pour appeler une fonction avec un lien tardif ( en gros ) :

1 ) Charger l'assembly.
2 ) Chercher la méthode dans l'assembly.
3 ) Créer une instance de la classe si la méthode n'est pas static.
4 ) Appeler la méthode.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 août 2005 à 17:02
Tu veux dire que si tu passes un paramètre de type IFonctionsDisponibles tu te retrouves avec le même probléme de liens dans les deux sens à la compilation !?
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 17:18
Pour le lien tardif, ok ca peut m'intéresser ... mais un lien ou un exemple de code me parlerait plus ^^



Pour IFonctionsDisponibles, justement non.

Auparavant, j'utilisais une méthode statique sur l'objet que je
CONNAISSAIS. Là, pour pouvoir créer mes dlls, il faut que j'arrive a me
mettre d'un coté ou d'un autre des pointillets rouges et a compiler le
tout sans avoir accès à l'autre coté des pointillets rouges (c'est
marrant de parler avec des dessins ^^) ... et donc si je me met du coté
du GestionnaireFonctions, je ne suis pas censé connaitre la classe
FonctionsDisponibles et donc encore moins sa méthode statique
permettant de retourner le tableaux des fonctions implémentées ^^



Maintenant, l'architecture que je décrivais au dessus est celle la :





Mais la encore je me retrouve à me mordre la queue puisque j'ai beau
avoir créé une interface "visible" par le GestionnaireFonctions, je
n'ai pas "d'instance" de cette interface sous la main
(puisqu'auparavant j'utilisais une méthode statique ;) )
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 août 2005 à 18:07
Tu ne peux pas refiler ce projet à ton collègue de bureau ? : ) Je suis pas sûr de tout comprendre, ton singleton implémente l'interface IFonctionsDisponibles et le gestionnaire de fonction travaille sur un objet IFonctionsDisponibles, donc le gestionnaire n'a pas besoin de connaitre la classe FonctionDisponibles, tu vas lui passer la classe FonctionDisponibles mais elle sera casté en IFonctionDisponibles, on peut caster une classe dans l'interface qu'elle implémente.
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 18:21
Je ne dois pas être assez clair ^^

le but du jeu est, je le répète, de créer une DLL avec ce qu'il y a dans le rectangle en pointillés en bas.

Je suis -visiblement (ou alors j'ai peut etre mal compris le principe
de comment faire une dll... auquel cas, n'hésitez pas a me corriger
hein)- obligé de faire 2 projets (et 2 DLL également) pour cela :

- Un projet dans lequel je met tout ce qui est dans le rectangle rouge
du "haut", qui n'a aucune référence vers le projet du bas, donc qui
compile correctement (à une exception pres : cf (*) )

- Un projet dans lequel je met tout ce qui est dans le rectangle rouge
du "bas", qui lui a des références vers le projet du haut ... donc lors
de la compilation, il me jette (normal) ... par contre, si j'arrive a
faire une dll du projet du haut et que je l'importe dans ce projet, je
devrais réussir a faire ma dll (non ?)



Maintenant, l'exception :

(*) ca ne compile pas correctement car il me faut une référence vers une INSTANCE que je ne CONNAIS PAS. En effet :

- soit j'ai la premiere architecture (1er schéma) et alors c'est normal
que ca ne compile pas puisque j'ai une référence vers une classe que je
n'ai pas dans mon projet (FonctionsDisponibles) : dans le code de
GestionnaireFonctions, j'ai quelque chose du type :

_fonctionsDisponibles = FonctionsDisponibles.getFonctionsDisponibles(this);

- soit j'ai la seconde architecture, auquel cas j'hérite de l'interface
IFonctionsDisponibles ... mais il faut que j'adapte le code précédent
(la ligne juste au dessus de celle la) ... et là je serais curieux de
voir comment c'est possible ;) (je n'ai pas d'INSTANCE)



j'espere m'etre plus clairement exprimé v_v
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 août 2005 à 19:07
J'étais d'accord avec tout ca..
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 19:36
J'avais cru que non lorsque tu as dit "donc le gestionnaire n'a pas besoin de connaitre la classe
FonctionDisponibles, tu vas lui passer la classe FonctionDisponibles
mais elle sera casté en IFonctionDisponibles, on peut caster une classe
dans l'interface qu'elle implémente."



Ce qui cloche dans ce que tu as dit est "le gestionnaire de fonction
travaille sur un objet IFonctionsDisponibles" : comment ce
IFonctionsDisponibles a-t-il pu être instancié ?
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
17 août 2005 à 19:38
(bien sur quand je parle de IFonctionsDisponibles et
d'instanstanciation, ca n'est pas sur l'interface mais sur une
sous-classe concrète hein ... le probleme est que je ne vois pas
comment "instancier" cette sous classe contrète)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
17 août 2005 à 20:22
L'interêt que je vois dans l'interface c'etait justement de ne plus avoir besoin de connaitre le type, et de compiler la première DLL sans dépendance avec la deuxième, si tu dis que c'est pas faisable c'est qu'il y'a qlq'chose sur lequel on est pas d'accord, mais bon n'oublie pas que c'est pas mon projet et que c'est difficile de tout "visualiser". J'ai proposé des idées tant pis si ca ne corresponds pas, si rien ne va reste mon idée première càd utiliser la réflexion, mais là pareil y'a que toi qui a une vision globale de ton projet qui peut voir comment implémenter ca.
0
Atmaweapon Messages postés 50 Date d'inscription dimanche 28 décembre 2003 Statut Membre Dernière intervention 11 avril 2006 1
18 août 2005 à 11:39
Je comprend bien tout ca... mais j'ai l'impression de pas arriver a me faire comprendre...

Disons qu'au départ, j'avais :

_fonctionsDisponibles = FonctionsDisponibles.getFonctionsDisponibles(this);

Pour les raisons qu'on a pu voir, en utilisant une méthode statique
(donc pas besoin d'instance), cela ne pouvait pas marcher... Le
probleme est que même en utilisant une interface ca ne peut pas marcher
non plus à cause du fait qu'il faut une instance pour pouvoir appeler
une méthode implémentée de l'interface... instance que je ne peux avoir
sans créer un FonctionsDisponibles (et donc je me mord la queue) ^^;

Le principal probleme est -qu'a mon avis- ca n'est pas possible de
compiler les dll puisqu'elles ont des dépendances "croisées" (d'où le
titre du topic ;) ) et le probleme est de savoir :

- s'il est possible de compiler comme ca, des dll croisées, et si c'est le cas, quelle est la marche a suivre ?

- sinon, je suis ouvert a la Reflexion ... le probleme est que je ne
"sais" pas faire ... et que je n'ai pas de collègue de bureau compétent
pour pouvoir m'aider à le faire :)
0
Rejoignez-nous