过去写了一个运行环境,支持以模块化的方式进行程序开发和管理,当时考虑做一个大项目的时候可以将独立的模块分配到多个开发小组并行进行,从而提高开发效率,实践过程中确实也达到了最初的设定目标。但是我们不会至此停留不前,经过一年的应用我们发现了一点问题,相信很多做项目的同僚都会发现,项目要随需而变不但要求框架本身易于扩展,还要求在运行时能够动态更新,要不然就只能等系统闲下来的时候再更新,这也是为什么很多人都选择夜里更新程序的原因(白天很多在线用户)。随需而变嘛,把模块的加载再改进一步,支持动态加载就OK了,更新模块的时候直接覆盖,系统监视文件变化,自动重新加载,用户完全感觉不到系统已经升级了。
改进主要涉及两个方面:
1.程序集的加载
要求程序集不能被占用,因为如果被Asp.net进程占用的话,覆盖文件会导致整个应用重新启动,这样就不能用原来的Assembly.LoadFrom了,替换的解决方法是Assembly.Load(byte[] rawAssembly)
2.监视模块更新变化
用系统自带的文件变化监视类FileSystemWatcher就可以实现