需要解释的是这里我们在传递编译参数时设置了GenerateInMemory为true这表明生成的DLL会被加载在内存中(随后被默认引用入当前应用程序域)在调用GetTime方法时我们需要加入参数传递object类型的数组并通过Reflection的InvokeMember来调用在创建生成的Assembly中的对象实例时需要注意用到的命名空间是你输入代码的真实命名空间以下是我们输入的测试代码(为了方便所有的代码都在外部输入动态执行时不做调整)
namespace Dynamicly
{
public class HelloWorld
{
public string GetTime(string strName)
{
return Welcome + strName + Check in at + SystemDateTimeNowToString();
}
}
}
运行附件中提供的程序可以很容易得到一下结果
改进的执行过程
现在一切看起来很好我们可以编译代码并把代码加载到当前应用程序域中来参与我们的活动但你是否想过去卸载掉这段程序呢?更好的去控制程序呢?另外当你运行这个程序很多遍的时候你会发现占用内存很大而且每次执行都会增大内存使用是否需要来解决这个问题呢?当然需要否则你会发现这个东西根本没用我需要执行的一些大的应用会让我的服务器crzay不堪重负而疯掉的
要解决这个问题我们需要来了解一下应用程序域NET Application Domain是NET提供的运行和承载一个活动的进程(Process)的容器它将这个进程运行所需的代码和数据隔离到一个小的范围内称为Application Domain当一个应用程序运行时Application Domains将所有的程序集/组件集加载到当前的应用程序域中并根据需要来调用而对于动态生成的代码/程序集我们看起来好像并没有办法去管理它其实不然我们可以用Application Domain提供的管理程序集的办法来动态加载和移除Assemblies来达到我们的提高性能的目的具体怎么做呢在前边的基础上增加以下步骤
·创建另外一个Application Domain
·动态创建(编译)代码并保存到磁盘
·创建一个公共的远程调用接口
·创建远程调用接口的实例并通过这个接口来访问其方法
换句话来讲就是将对象加载到另外一个AppDomain中并通过远程调用的方法来调用所谓远程调用其实也就是跨应用程序域调用所以这个对象(动态代码)必须继承于MarshalByRefObject类为了复用这个接口被单独提到一个工程中并提供一个工厂来简化每次的调用操作
[] [] [] [] []