写在前面:在分布式系统中,应用服务器与客户端分布在不同的计算机中。而应用服务器的更新往往是一个麻烦的事情,因为它往往需要管理员(假设同时是程序更新人员)停止应用服务器,更新程序。这样,服务就不得不中断,而且服务恢复的速度与程序更新的速度和管理员的操作严紧性有关,一不小心更新错了还会产生恶劣的影响,这样导致管理员操作压力很大。长远来说,这肯定是不合适的。下面就这个问题作一些讨论。
设计思路
如果可以设计一个永远不更新的程序来管理我们需要更新的程序,那问题就解决了。即应用服务器程序不是单独地运行,它是被另一个程序管理着的,那就是主程序。主程序是不会进行更新的,次程序就是我们的应用服务器。这样的主程序,次程序,也许是一个比较难设计的东西,不过在.NET就已经有一个对应的概念,那就是.NET的应用程序域。

在.NET中,Dll一旦被调用和运行之后,是不可以被卸载的。要卸载就卸载整个应用程序域,所谓的应用程序域是.NET的一个概念,可以理解为一个程序域管多个dll或exe文件,.NET应用服务器只管理托管代码,不管理到非托管代码。
设计重点
主程序域的设计时应该尽量的简单,可以设计为一个exe,是不能带入业务逻辑的。是否需要更新和什么时候更新,是需要次程序域提供信息的,也就是次程序域提供信息给主程序域,当前自己是否需要更新。非把更新的信息传给主程序域,主程序域使用订阅信息的方法侦听次程序域的更新指令。
使运行目录下面的Dll可写
怎样保证应用程序域被卸载后DLL就可以被置换呢,使用.NET程序集加载的指令ShadowCopyFiles就行了。这个指令可以将本目录下面的DLL复制到一个临时目录运行,这样,就解决了问题。
代码参考
下面是调用次应用程序域的参考代码。
public void SetRemoteLoaderObject(string dllName)
{
AppDomainSetup setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true";
domain = AppDomain.CreateDomain(dllName, null, setup);
domains.Add(dllName, domain);
try
{
Object _obj = domain.CreateInstanceFromAndUnwrap(
"ABCD.Library.dll", "ABCD.Library.DoSomethingLogic") ;
//return rl;
//MessageBox.Show(_obj.GetCnt().ToString());
}
catch
{
throw new Exception();
}
}
出处:Chakman
添加到百度搜藏
添加到雅虎收藏