加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 04:31:59 所属栏目:asp.Net 来源:网络整理
导读:我正在使用一个自定义框架,该框架使用反射对从数据库获取的完全限定类型名称执行GetTypeByName(字符串fullName),以创建所述类型的实例并将其添加到页面,从而生成标准模块化的东西. GetTypeByName是我的一个实用函数,它简单地遍历Thread.GetDomain().GetAssem
我正在使用一个自定义框架,该框架使用反射对从数据库获取的完全限定类型名称执行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周期的影响.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读