C#反射實現簡單的外掛系統
如果用過一些優秀的開源或是非開源的應用軟體,就會發現這些軟體的一個很大的優勢就是其開放性,任何有能力的人都可以為其開發不同的外掛來增強其的功能。比如著名的foobar2000,Vim和TotalCommander等等。
C#的反射可以用來實現一個簡單的外掛系統。思路很簡單,我們建立一個解決方案,包含三個工程,一個為我們的軟體MyApplication,一個為外掛介面IPlugin,一個為具體的外掛MyPlugin。外掛系統的基本思路是我們用一個介面類庫,來定義我們軟體可以使用的外掛必須實現的方法簽名。然後我們的軟體MyApplication通過引用該IPlugin dll來動態呼叫,而具體的實現外掛MyPlugin則引用該介面來實現具體的方法。這樣我們的應用程式就能在不知道具體外掛的情況下呼叫外掛了。。
結構圖如下:
關鍵程式碼也就是通過對程式集載入。搜尋到對應介面的實現類。然後呼叫即可。
Assembly a = Assembly.LoadFrom(AssemblyName);
foreach (Type t in a.GetTypes())
{
if (t.GetInterface("IMyFunction") != null)
{
try
{
IMyFunction pluginclass = Activator.CreateInstance(t) as IMyFunction;
pluginclass.doSomething();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
執行結果: