asp.net – 在Web.config更改后程序集不可用

我正在使用一个自定义框架,该框架使用反射对从数据库获取的完全限定类型名称执行GetTypeByName(字符串fullName),以创建所述类型的实例并将其添加页面,从而生成标准模块化的东西.

GetTypeByName是我的一个实用函数,它简单地遍历Thread.GetDomain().GetAssemblies(),然后执行一个assembly.GetType(fullName)来查找相关类型.显然,这个结果会被缓存以供将来参考和使用.

但是,我遇到了一些问题,如果web.config得到更新(并且在某些更可怕的实例中,如果应用程序池被回收)那么它将失去对某些程序集的所有知识,从而导致无法呈现模块类型.调试显示当前线程程序集列表中不存在缺少的程序集.

为了解决这个问题,我添加了第二个检查,它有点脏,但通过/ bin /目录的DLL进行递归,并检查程序集列表中是否存在每个DLL.如果没有,则使用Assembly.Load加载它并通过‘Solving the Assembly Load Context Problem’修复上下文问题.

这可行,只是看起来(并且我知道这不可能)一些项目仍然可以访问缺少的程序集,例如我的实际Web项目而不是框架本身 – 然后它会抱怨重复的引用已被添加

有没有人听说过这样的事情,或者有任何想法为什么一个程序集在配置更改时根本不存在?如果没有一个解决方案,那么让bin中的所有程序集重新加载的最优雅的解决方法是什么?它需要全部在一个“命中”,以便网站访问者除了一个小延迟之外看不到任何差异,因此app_offline.htm文件是不可能的.以编程方式重命名bin中的DLL,然后将其命名回来确实有效,但需要IIS用户帐户的“修改”权限,这是疯了.

感谢社区可以收集的任何指示!

解决方法

通常,您应该避免依赖于当前在appdomain中加载的程序集,因为这是动态发生的.相反,只需调用System.Web.Compilation.BuildManager.GetType()而不是Type.GetType()或Assembly.GetType().这应该为您做正确的事情,而不受appdomain周期的影响.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....