插件机制附处可见,甚至连很多WEB程序也会有。比如说DZ的论坛,动网的论坛等。在应用程序里面,跑插件的时候,最大的问题有两个:
1.插件的crash引起整个应用程序的crash
2.插件有问题时,修改后,需要停下整个程序,来更换插件。
在这时候,进程外插件的好处就显而易见:因为插件加载在进程外,所以插件crash了,不会影响主进程。同时可以自由地卸载插件。
在.net里面,实现进程外的插件的原理是:让插件跑在和主进程不同的AppDomain里面。
但是跨AppDomain来加载程序集确会有权限的问题,所以不能再像以前加载一个DLL后,去遍历每个类,来看有没有合适的插件在里面。它只能根据已知的类名来加载程序集。所以我先设计一个接口:
public interface IPlugInSum
{
string[] GetPlugIns();
}
在这个接口里面实现对每个插件的描述:
public class PlugInSum :MarshalByRefObject, IPlugInSum
{
public string[] GetPlugIns()
{
return new string[] { "DemoPlugIn.DemoPlugIn", "DemoPlugIn.DemoPlugIn2" };
}
}
在这里面我实现了两个插件。同时强制要求这个描述对象的typename为:DemoPlugIn.PlugInSum。这样主进程里面获取了所有的类名后,就可以一个一个地去把插件加载起来了。