使用插件机制来扩展B/S程序,主要需要实现两个功能,首先是动态编译插件中的C#代码,然后利用反射来执行插件已经编译的C#代码。
一、动态编译
插件一般是以xml文件的形式实现其配置,必须要先读取插件中的C#代码才能进行动态编译。
.Net为我们提供了很强大的支持来实现这一切我们可以去做的基础,主要应用的两个命名空间是:System.CodeDom.Compiler和Microsoft.CSharp或Microsoft.VisualBasic。另外还需要用到反射来动态执行你的代码。动态编译并执行代码的原理其实在于将提供的源代码交予CSharpCodeProvider来执行编译(其实和CSC没什么两样),如果没有任何编译错误,生成的IL代码会被编译成DLL存放于于内存并加载在某个应用程序域(默认为当前)内并通过反射的方式来调用其某个方法或者触发某个事件等。之所以说它是插件编写的一种方式也正是因为与此,我们可以通过预先定义好的借口来组织和扩展我们的程序并将其交还给主程序去触发。一个基本的动态编译并执行代码的步骤包括:
将要被编译和执行的代码读入并以字符串方式保存
声明CSharpCodeProvider对象实例
调用CSharpCodeProvider实例的CompileAssemblyFromSource方法编译
用反射生成被生成对象的实例(Assembly.CreateInstance
调用其方法
以下代码片段包含了完整的编译和执行过程:
这里引用了 System.CodeDom和System.CodeDom.Compiler。
读取插件中的C#代码并进行动态编译后,要实现插件功能,就需要执行已经编译好的插件的dll中的代码了。
二、利用反射实现插件功能
反射的原理这里就不再说了,三层架构中用的太多了,呵呵。
忘了说一下,要实现反射,我们需要先在网站中定义好的一个IPlugin接口
然后所有的插件的C#代码都继承自这一个接口。
还是把我做的DEMO发上来吧,讲的不好,大家还是看源码吧,里面都有注释,呵呵。
下载地址:http://www.box.net/shared/a2ceqq67ts