2010-09-10 8 views
1

J'ai un projet exécutable appelé A.EXE qui fait référence à une bibliothèque de classe C# B.DLL. A.EXE génère des événements gérés par une classe dans B.DLL. Les événements utilisent un enfant EventArgs personnalisé appelé ProjectEventArgs. Dois-je ajouter une référence pour A.EXE au projet B.DLL afin que la classe ProjectEventArgs soit définie? Cela ne me semble pas tout à fait juste car je pense que c'est une dépendance circulaire.Gestion des événements dans l'assemblage C#

Existe-t-il un moyen de refactoriser mon code pour éviter cela?

merci, Andy

Répondre

2

Vous ne pouvez pas référencer a.exe de b.dll en premier lieu, donc non, ce n'est pas la solution. Même si a était une DLL, vous ne seriez pas en mesure de faire la référence car elle introduirait une référence circulaire entre les assemblées, ce qui n'est pas autorisé.

Première décision de refactoriser votre code, décidez si ProjectEventArgs doit ou non appartenir à la DLL ou à l'application. La façon de faire est de vérifier quelles autres dépendances la classe ProjectEventArgs a - est-ce dépendant d'autres types de A.exe, ou n'a pas d'autres dépendances? (Si ce dernier, collez-le dans la DLL). Dans le cas où il y a des dépendances dans A, vous devez extraire la fonctionnalité de ProjectEventArgs dans une classe de base (abstraite) ou une interface. (Ou, puisque c'est un enfant d'EventArgs déjà - pouvez-vous ne pas capturer toutes les fonctionnalités dont vous avez besoin en utilisant simplement les EventArgs de B?)

Vraiment pourrait faire avec un exemple de code de votre classe ProjectEventArgs, et un extrait de l'endroit où vous l'utilisez/l'appelez pour donner une solution d'échantillon réelle.

+2

En fait, vous pouvez référencer un fichier EXE à partir d'une DLL (ou d'un autre fichier EXE). Les anciennes versions de Visual Studio ne l'autorisaient pas, mais elles étaient toujours autorisées par le CLR. –

+0

Merci. Qui aide. L'approche que je vais utiliser est la suivante: créer une classe Project générique dans B.DLL. Dans A.EXE, créez un enfant spécifique à l'application et transmettez-le à B.DLL. Puis, dans d'autres applications basées sur les mêmes assemblages, je peux créer d'autres enfants spécifiques à l'application de la classe Project. – Andy

4

Votre B.dll ne devrait pas savoir quoi que ce soit au sujet a.exe - vous avez raison, vous créez une dépendance circulaire.

Vous devez refactoriser le code afin que les méthodes qui génèrent les événements soient dans B.DLL ou un troisième assembly référencé par A et B. À tout le moins, la définition de ProjectEventArgs doit être déplacée de A. Sans voir votre code et une structure de projet plus détaillée, il sera difficile de dire quelle sera la meilleure approche.