从原理上很简单,先定义统一接口,主程序根据预定义的接口加载DLL,示例代码
public static int Test()
{
try
{
System.IO.FileInfo fi = new System.IO.FileInfo("noock.demo.plugins.dll"); // 加载插件库
System.Console.WriteLine("Loading file:{0}", fi.FullName);
System.Reflection.Assembly plugin = System.Reflection.Assembly.LoadFile(fi.FullName);
string[] names = { "noock.demo.plugins.HelloMessager", "noock.demo.plugins.ByeMessager" }; // 示例插件
foreach (string className in names)
{
System.Type ta = plugin.GetType(className, true);
Object oa = Activator.CreateInstance(ta); // 要求有一个不带参数的构造函数,如果需要参数也可以使用其它的重载函数
if (!(oa is IMessager)) // IMessager为统一接口
throw new Exception(string.Format("Not a class type implemented interface IMessager"));
IMessager ia = oa as IMessager;
MessageBox.Show(ia.GetMessage());
}
}catch(Exception ex){
MessageBox.Show(String.Format("Plug-in test failed:{0}/r/n{1}", ex.Message, ex.StackTrace));
return -1;
}
return 0;
}