在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近的项目中涉及到Asp.Net扩展性,考虑了两种扩展方法,一种是使用Web Services实现,另一种是动态生成代码然后利用反射来实现插件功能。现在网上博客什么的都是用插件的形式来扩展功能的,所以我也打算用插件来扩展asp.net网站的功能。
使用插件机制来扩展B/S程序,主要需要实现两个功能,首先是动态编译插件中的C#代码,然后利用反射来执行插件已经编译的C#代码。 (原文地址:木子博客 http://blog.moozi.net/read-228.html) 一、动态编译 插件一般是以xml文件的形式实现其配置,必须要先读取插件中的C#代码才能进行动态编译。
XmlDocument doc = new XmlDocument();
try }
.Net为我们提供了很强大的支持来实现这一切我们可以去做的基础,主要应用的两个命名空间是:System.CodeDom.Compiler和Microsoft.CSharp或Microsoft.VisualBasic。另外还需要用到反射来动态执行你的代码。动态编译并执行代码的原理其实在于将提供的源代码交予CSharpCodeProvider来执行编译(其实和CSC没什么两样),如果没有任何编译错误,生成的IL代码会被编译成DLL存放于于内存并加载在某个应用程序域(默认为当前)内并通过反射的方式来调用其某个方法或者触发某个事件等。之所以说它是插件编写的一种方式也正是因为与此,我们可以通过预先定义好的借口来组织和扩展我们的程序并将其交还给主程序去触发。一个基本的动态编译并执行代码的步骤包括: 将要被编译和执行的代码读入并以字符串方式保存 以下代码片段包含了完整的编译和执行过程:
CodeSnippetCompileUnit unit = new CodeSnippetCompileUnit(code);
ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler(); CompilerParameters para = new CompilerParameters(); para.ReferencedAssemblies.Add("System.dll"); para.ReferencedAssemblies.Add("System.Data.dll"); para.ReferencedAssemblies.Add("System.XML.dll"); para.ReferencedAssemblies.Add("System.Drawing.dll"); para.ReferencedAssemblies.Add("System.Web.dll"); para.ReferencedAssemblies.Add(Server.MapPath(this.Request.ApplicationPath + "/bin/PluginDemo.dll")); para.GenerateExecutable = false; para.OutputAssembly = dllPath; //编译结果 CompilerResults cr = compiler.CompileAssemblyFromDom(para, unit); if (cr.Errors.Count > 0) } 这里引用了 System.CodeDom和System.CodeDom.Compiler。 读取插件中的C#代码并进行动态编译后,要实现插件功能,就需要执行已经编译好的插件的dll中的代码了。 二、利用反射实现插件功能 反射的原理这里就不再说了,三层架构中用的太多了,呵呵。
public string GetPluginOutPut(string strPluginName)
}
忘了说一下,要实现反射,我们需要先在网站中定义好的一个IPlugin接口
}
然后所有的插件的C#代码都继承自这一个接口。 还是把我做的DEMO发上来吧,讲的不好,大家还是看源码吧,里面都有注释,呵呵。 |
请发表评论