tag*_*s2k 8 asp.net reflection assemblies
我正在使用一个自定义框架,它使用反射来GetTypeByName(string fullName)对从数据库获取的完全限定类型名称进行操作,以创建所述类型的实例并将其添加到页面中,从而产生标准的模块化类型.
GetTypeByName是我的一个实用函数,只需迭代Thread.GetDomain().GetAssemblies(),然后执行一个assembly.GetType(fullName)查找相关类型.显然,这个结果会被缓存以供将来参考和使用.
但是,我遇到了一些问题,如果web.config得到更新(并且在一些更可怕的实例中,如果应用程序池被回收)那么它将失去对某些程序集的所有知识,导致无法呈现模块类型.调试显示当前线程程序集列表中不存在缺少的程序集.
为了解决这个问题,我添加了第二个检查,它有点脏,但通过/ bin /目录的DLL进行递归并检查程序集列表中是否存在每个检查.如果没有,则使用Assembly.Load加载它并通过"解决程序集加载上下文问题"修复上下文问题.
这可行,只是看起来(并且我知道这不可能)一些项目仍然可以访问缺少的程序集,例如我的实际Web项目而不是框架本身 - 然后它会抱怨重复的引用已被添加!
有没有人听说过这样的事情,或者有任何想法为什么一个程序集在配置更改时根本不存在?没有一个解决方案,最优雅的解决方法是让bin中的所有程序集重新加载?它需要全部在一个"点击",以便网站访问者除了一个小延迟之外看不到任何差异,因此app_offline.htm文件是不可能的.以编程方式重命名bin中的DLL然后将其命名回来确实有效,但需要IIS用户帐户的"修改"权限,这是疯狂的.
感谢社区可以收集的任何指示!
通常,您应该避免依赖应用程序域中当前加载的程序集,因为这种情况是动态发生的。相反,只需调用 System.Web.Compilation.BuildManager.GetType() 而不是 Type.GetType() 或 Assembly.GetType()。这应该为您做正确的事情,并且不受应用程序域周期的影响。
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |