2011-12-19 110 views
5

我一直在研究一個項目,並且隨着它的發展,我意識到兩個不能連接在一起的部分是相互依賴的。csc.exe和相互依賴的程序集

我們稱這兩部分爲a.exe和b.dll。 b.dll提供了一個允許a.exe檢索數據的實現,但我希望它是它自己的獨立程序集,以便它可以很容易地被更改爲使a.exe與不同的數據源進行通信。

但是,雖然需要a.exe來引用b.dll,但b.dll需要幾個功能,這些功能是a.exe不可分割的一部分。

由於我一直在編譯 - 測試 - 因爲我一直在編寫這個項目,a.exe和b.dll都存在,我可以編譯b.dll對a.exe和a.exe反對b.dll,但我/我可以從源碼重建這兩個?

+0

你怎麼沒有從Visual Studio得到循環依賴錯誤? – Oded 2011-12-19 18:39:49

+0

@Oded他正在使用命令行編譯 - 您可以迭代地構建它,並創建循環依賴關係 - 但它使得它永遠不會執行乾淨的重建(沒有極端困難)。 – 2011-12-19 18:40:52

+0

@ReedCopsey - 我認爲他可能會這樣做,但希望得到OP的確認。正如你所說,在這種情況下,乾淨的構建是不可能的。 – Oded 2011-12-19 18:41:40

回答

2

調用CSC.EXE,編譯源爲A.EXE和B.DLL份進入a.exe,調用csc.exe,co將b.dll的源代碼轉換爲b.dll並引用a.exe,然後再次調用csc.exe,將a.exe的源代碼編譯爲a.exe並引用b.dll。

4

通常,重構這個並將共享依賴關係移動到它們自己的程序集(c.dll)中是一個好主意。這樣,a.exe和b.dll都可以引用c.dll,並且您可以避免這種循環依賴。

+0

如果我這樣做,但在這種情況下,我只能想象該c.dll將取決於a.exe和b.dll。 該功能與b.dll和a.exe中的代碼無法正確分離。 – 2011-12-19 18:56:50

+1

@RobertAllanHenniganLeahy你的目標應該是分開這個。嘗試設計您的API,使其解耦。沒有理由這些類型應該都是相互依賴的。您可以隨時在c.dll中定義a.exe或b.dll實現的接口,以提供功能,或使用委託等。這樣的循環依賴關係始終可以解決...... – 2011-12-19 18:58:40

+0

我應該看不到爲了避免它們,需要避免相互依賴性,特別是當您建議的方法可能會增加複雜性和大小並潛在地降低性能時。我想通過這個問題一個簡單的方法 - 調用csc。將a.exe和b.dll的源碼編譯爲a.exe,調用csc.exe,將b.dll的源代碼編譯爲b.dll並引用a.exe,然後最後一次調用csc.exe,將a.exe的源代碼編譯爲a.exe並引用b.dll。 – 2011-12-19 19:29:51

5

我會重構系統分爲三個組件:

  • A.EXE - 主EXE沒有什麼應該參考這個
  • B.DLL - 正如你今天擁有它,但不A.EXE參考,它引用c.dll
  • c.dll - 此應包含共同個/既a和b需要引用
+0

b.dll只包含一個類 - 讓我們將其稱爲DataSource - 並且a.exe包含一個類庫,但是b.dll所需的唯一一個類是稱爲Server的類,它是a.exe的主要組件。 – 2011-12-19 18:46:01