• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

基于ASP.NETWebApplication的插件实现,附DEMO

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

最近的项目中涉及到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存放于于内存并加载在某个应用程序域(默认为当前)内并通过反射的方式来调用其某个方法或者触发某个事件等。之所以说它是插件编写的一种方式也正是因为与此,我们可以通过预先定义好的借口来组织和扩展我们的程序并将其交还给主程序去触发。一个基本的动态编译并执行代码的步骤包括:

将要被编译和执行的代码读入并以字符串方式保存
声明CSharpCodeProvider对象实例
调用CSharpCodeProvider实例的CompileAssemblyFromSource方法编译
用反射生成被生成对象的实例(Assembly.CreateInstance
调用其方法

以下代码片段包含了完整的编译和执行过程:

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发上来吧,讲的不好,大家还是看源码吧,里面都有注释,呵呵。

下载演示DEMO 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[转]ASP.NETMVCURL路由简介发布时间:2022-07-10
下一篇:
详细讲解jquery带进度上传插件Uploadify(ASP.NET版本)使用发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap