2010-09-10 2 views
1

У меня есть исполняемый проект, называемый A.EXE, который ссылается на библиотеку классов C# B.DLL.Обработка событий в сборке C#

A.EXE генерирует события, которые обрабатываются классом в B.DLL. В событиях используется собственный дочерний элемент EventArgs, называемый ProjectEventArgs.

Нужно ли добавить ссылку на A.EXE в проект B.DLL, чтобы определить класс ProjectEventArgs? Это не кажется мне совершенно правильным, поскольку я думаю, что это круговая зависимость.

Есть ли способ реорганизовать мой код, чтобы этого избежать?

спасибо, Энди

ответ

2

Вы не можете ссылаться на a.exe с b.dll в первую очередь, так что нет, это не решение. Даже если это была DLL, вы не сможете сделать ссылку, потому что она представит круговую ссылку между сборками, что не разрешено.

Первое решение по рефакторингу кода определяет, принадлежит или нет ProjectEventArgs в dll или приложении. Способ сделать это - проверить, какие другие зависимости имеет класс ProjectEventArgs - это зависит от других типов от A.exe или не имеет других зависимостей? (Если последний, вставьте его в dll).

В случае, если у него есть зависимости внутри A, вам необходимо отделить функциональность ProjectEventArgs от базового (абстрактного) класса или интерфейса. (Или, поскольку он уже является дочерним элементом EventArgs - не можете ли вы захватить всю необходимую функциональность, просто используя EventArgs из B?)

Действительно может сделать с образцом кода вашего класса ProjectEventArgs и фрагментом, где вы используете/называете это, чтобы дать реальное образец решения.

+2

На самом деле вы можете ссылаться на EXE из DLL (или другого EXE). Старые версии Visual Studio не позволяли этого, но это всегда разрешалось CLR. –

+0

Спасибо. Что помогает. Подход, который, я думаю, я буду использовать: создать общий класс Project в B.DLL. В A.EXE создайте дочерний элемент приложения и передайте его B.DLL. Затем в других приложениях, основанных на одних и тех же собраниях, я могу создавать другие дочерние приложения для класса Project. – Andy

4

Ваш B.DLL не должно ничего о A.exe знает - вы правы, вы создаете циклическую зависимость.

Вам необходимо реорганизовать код, чтобы методы, генерирующие события, находились в B.DLL или третьей сборке, на которые ссылаются как A, так и B. По крайней мере, определение ProjectEventArgs должно быть перенесено из A.

Без просмотра кода и более подробной структуры проекта будет трудно сказать, какой из них будет лучшим.

Смежные вопросы