2010-09-10 67 views
1

我有一個名爲A.EXE的可執行項目,它引用了C#類庫B.DLL。在C#彙編中處理事件

A.EXE生成由B.DLL中的類處理的事件。這些事件使用名爲ProjectEventArgs的自定義EventArgs子項。

是否需要將A.EXE的引用添加到B.DLL項目中,以便定義ProjectEventArgs類?這對我來說似乎不太合適,因爲我認爲這是一種循環依賴。

有沒有一些方法來重構我的代碼,以避免這種情況?

感謝,安迪

回答

2

你不能首先從b.dll引用a.exe,所以不行,那不是解決方案。即使a是DLL,也不能執行引用,因爲它會在程序集之間引入循環引用,這是不允許的。

重構代碼的第一個決定是決定ProjectEventArgs是否屬於dll或應用程序。這樣做的方法是檢查ProjectEventArgs類具有哪些其他依賴關係 - 取決於來自A.exe的其他類型還是沒有其他依賴關係? (如果是後者,請將其粘貼到dll中)。

如果它確實存在A內的依賴關係,則需要將ProjectEventArgs的功能抽象爲基類(抽象)類或接口。 (或者,因爲它已經是EventArgs的孩子了 - 你能不能通過簡單地使用B的EventArgs來捕獲所需的所有功能嗎?)

真的可以用你的ProjectEventArgs類的代碼示例做一個代碼片段你使用/調用它來給出一個實際的樣本解決方案。

+2

實際上,您可以從DLL(或其他EXE)引用EXE。早期版本的Visual Studio不允許它,但它總是被CLR允許的。 – 2010-09-10 22:06:03

+0

謝謝。這有幫助。我想我會使用的方法是:在B.DLL中創建一個通用的Project類。在A.EXE中創建一個特定於應用程序的子項並將其傳遞給B.DLL。然後在基於相同程序集的其他應用程序中,我可以創建Project類的其他特定於應用程序的子項。 – Andy 2010-09-10 22:27:47

4

你應該B.DLL不知道什麼A.EXE - 你是對的,你正在創建一個循環依賴。

您需要重構代碼,以便生成事件的方法位於B.DLL或由A和B引用的第三個程序集中。至少ProjectEventArgs的定義需要從A中移出。

沒有看到你的代碼和更詳細的項目結構,很難說哪個是最好的方法。