唐山网站建设

设为主页 加入收藏 繁體中文

具体解读.NET中的代码动态编译

核心提示:代码的动态编译并履行是1个.NET平台提供给我们的很强大的工具用以灵活扩大(固然是面对内部开发职员)复杂而没法估算的逻辑,并通过1些额外的代码来扩大我们已有的利用程序....

代码的动态编译并履行是1个.NET平台提供给我们的很强大的工具用以灵活扩大(固然是面对内部开发职员)复杂而没法估算的逻辑,并通过1些额外的代码来扩大我们已有的利用程序。

这在很大程度上给我们提供了另外1种扩大的方式(固然这其实不能算是严格意义上的扩大,但最少为我们提供了1种思路)。

动态代码履行可以利用在诸如模板天生,外加逻辑扩大等1些场合。1个简单的例子,为了网站那的响应速度,HTML静态页面常常是我们最好的选择,但基于数据驱动的网站常常又很难用静态页面实现,那末将动态页面天生html的工作或许就是1个很好的利用处合。另外,对1些模板的套用,我们一样可以用它来做。另外这本身也是插件编写的方式。

最基本的动态编译

.Net为我们提供了很强大的支持来实现这1切我们可以往做的基础,主要利用的两个命名空间是:System.CodeDom.Compiler和Microsoft.CSharp或Microsoft.VisualBasic。另外还需要用到反射来动态履行你的代码。动态编译并履行代码的原理实在在于将提供的源代码交予CSharpCodeProvider来履行编译(实在和CSC没甚么两样),假设没有任何编译毛病,天生的IL代码会被编译成DLL寄存于于内存并加载在某个利用程序域(默以为当前)内并通过反射的方式来调用其某个方法或触发某个事件等。之所以说它是插件编写的1种方式也正是由于与此,我们可以通过预先定义好的借口来组织和扩大我们的程序并将其交还给主程序往触发。1个基本的动态编译并履行代码的步骤包括:

·将要被编译和履行的代码读进并以字符串方式保存

·声明CSharpCodeProvider对象实例

·调用CSharpCodeProvider实例的CompileAssemblyFromSource方法编译

·用反射天生被天生对象的实例(Assembly.CreateInstance)

·调用其方法

以下代码片断包括了完全的编译和履行进程:

需要解释的是,这里我们在传递编译参数时设置了GenerateInMemory为true,这表明天生的DLL会被加载在内存中(随后被默许援用进当前利用程序域)。在调用GetTime方法时我们需要加进参数,传递object类型的数组并通过Reflection的InvokeMember来调用。在创建天生的Assembly中的对象实例时,需要留意用到的命名空间是你输进代码的真实命名空间。以下是我们输进的测试代码(为了方便,所有的代码都在外部输进,动态履行时不做调剂):

运行附件中提供的程序,可以很轻易得到1下结果:

 

改进的履行进程

现在1切看起来很好,我们可以编译代码并把代码加载到当前利用程序域中来参与我们的活动,但你是否是想过往卸载掉这段程序呢?更好的往控制程序呢?另外,当你运行这个程序很多遍的时候,你会发现占用内存很大,而且每次履行都会增大内存使用。是否是需要来解决这个题目呢?固然需要,否则你会发现这个东西根本没用,我需要履行的1些大的利用会让我的服务器crzay,不堪重负而疯掉的。

要解决这个题目我们需要来了解1下利用程序域。.NET Application Domain是.NET提供的运行和承载1个活动的进程(Process)的容器,它将这个进程运行所需的代码和数据,隔离到1个小的范围内,称为Application Domain。当1个利用程序运行时,Application Domains将所有的程序集/组件集加载到当前的利用程序域中,并根据需要来调用。而对动态天生的代码/程序集,我们看起来仿佛并没有办法往治理它。实在不然,我们可以用Application Domain提供的治理程序集的办法来动态加载和移除Assemblies来到达我们的进步性能的目的。具体怎样做呢,在前边的基础上增加以下步骤:

·创建另外1个Application Domain

·动态创建(编译)代码并保存到磁盘

·创建1个公共的远程调用接口

·创建远程调用接口的实例。并通过这个接口来访问其方法。

换句话来讲就是将对象加载到另外1个AppDomain中并通过远程调用的方法来调用。所谓远程调用实在也就是跨利用程序域调用,所以这个对象(动态代码)必须继续于MarshalByRefObject类。为了复用,这个接口被单独提到1个工程中,并提供1个工厂来简化每次的调用操纵:

接下来在原来基础上需要修改的是:

·将编译成的DLL保存到磁盘中。

·创建另外的AppDomain。

·取得IRemoteInte***ce接口的援用。

1 2 下1页

核心提示:代码的动态编译并履行是1个.NET平台提供给我们的很强大的工具用以灵活扩大(固然是面对内部开发职员)复杂而没法估算的逻辑,并通过1些额外的代码来扩大我们已有的利用程序....

(将天生的DLL加载到额外的AppDomain)

·调用InvokeMethod方法来远程调用。

·可以通过AppDomain.Unload()方法卸载程序集。

以下是完全的代码,演示了如何利用这1方案。

对客户真个输进程序,我们需要继续于MarshalByRefObject类和IRemoteInte***ce接口,并添加对RemoteAccess程序集的援用。以下为输进:

这样,你可以通过适时的编译,加载和卸载程序集来保证你的程序始终处于1个可控消耗的进程,并且到达了动态编译的目的,而且由于在不同的利用程序域中,让你的本身的程序更加安全和硬朗。


上1页 1 2 唐山网站建设www.fw8.net


TAG:程序,进程,代码,动态,加载
评论加载中...
内容:
评论者: 验证码: