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

Signaler
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
-
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
-
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

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
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
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 ^_^
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 =)
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
c'est une solution qui me parait correcte


<HR>
Sébastien FERRAND

Blog : http://blogs.developpeur.org/sebmafate
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Est-ce-que la réflexion ne serait pas une solution, envisager un scenario avec ce qu'on appele je crois "un lien tardif" ?
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
J'y ai également pensé mais je ne sais absolument pas comment mettre ca en place ^_^
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
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
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 ? ^^
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
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.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
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 !?
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 ;) )
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
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.
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
J'étais d'accord avec tout ca..
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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é ?
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
(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)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
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.
Messages postés
50
Date d'inscription
dimanche 28 décembre 2003
Statut
Membre
Dernière intervention
11 avril 2006
1
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 :)