轉載自: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());
}
}
}
運行結果: