項目架構:
系統中的各功能都是分開在每個dll中實現的,主程序中加載各個菜單對應的dll。對於一些重復性比較高的功能代碼,可以寫在一個主dll裡供其他功能調用,直接引用主dll就可以實現。
Main.exe 主程序。
Core.dll 公共接口和存貯緩存等。
T1.dll 功能1
T2.dll 功能2
現在項目有這樣的需求:
要求兩個功能之間相互調用,即T1.dll中在T1.MainForm中點擊Button1去調用T2.dll中T2.MainForm中的相應功能,反之亦然,T2.MainForm點擊Button1調用T1.dll功能。
這時就遇到了問題,直接在工程中引用dll就會出現循環引用。所以得另辟蹊徑。
解決方案:
利用反射調用dll,就避免了循環引用。不同功能間的相互通信可通過接口來解決。
具體實現:
Main.exe中用反射加載各個功能菜單,對各個Form進行實例化,緩存起來供其他功能調用。入口和實例均存在Core.MenuFactory.htMenu這個HashTable中。
再構造接口IInteraction
接口IInteractionpublic interface IInteraction
{
/// <summary>
/// 簡單的交互
/// </summary>
void InterAction();
/// <summary>
/// 高級交互,可傳遞參數
/// </summary>
/// <param name="args"></param>
void InterAction(object [] args);
}