经过研究,我找到了解决方案的方法:
- 创建新的appdomain并将程序集加载到新的appdomain。
- 要更新程序集,请卸载appdomain包含该程序集,创建其他appdomain并使用较新版本加载程序集文件。
但是,我有两大问题:
- 文件锁定:虽然我为新的appdomain启用了shadowcopy,但实现了AssemblyResolve事件以从字节数组而不是真实文件加载程序集。我尝试删除汇编文件后读取到字节数组,应用程序仍然正常工作,我发现:如果有真正的汇编文件,deafault域将引用此程序集并在调用&#34后锁定其文件; CreateInstanceAndUnwrap"使用新的appdomain,所以我无法删除此文件。 (在新的appdomain中,ApplicationBase是默认appdomain的' bin'文件夹,AssemblyResolve事件从' bin'文件夹外的' Plugin'文件夹中加载汇编字节数组
- 只加载了一个程序集版本:在我尝试上面的错误方法以便能够删除程序集文件并替换为另一个版本之后,AssemblyResolve事件也从新文件加载字节数组,但是功能" CreateInstanceAndUnwrap"返回旧程序集的实例。我研究了很多网页,我发现ASP.Net将新程序集作为域中性程序集加载到其他域中,无法卸载。但我发现文章"Loading and Unloading an Assembly at Runtime"有一个示例成功加载其他程序集版本,但它是一个桌面应用程序。所以我用appdomain考虑ASP.Net中的问题。
醇>
是否有解决这些问题的最佳方法!