我正在为自动化调度程序编写一个插件体系结构,它需要健壮,所以我试图做ASP.NET/IIS风格的AppDomains - 即每个AppDomain是真的被视为它们自己独特的应用程序,它们之间没有共享对象。完整的ASP.NET风格的AppDomain程序集隔离
我在AppDomainSetup
中设置ApplicationBase
,ConfigurationFile
和ShadowCopyFiles
。
自动化调度程序中有一个常见的程序集,我为每个插件加载 - 它处理加载插件的主程序集,捕获未捕获的异常和记录。有迹象表明,我已经确定这种方法也有一些不足:
通过设置
ApplicationBase
到插件存储在何处,共同的组件(驻留在不同的路径)的任何依赖关系将不再得到解决。我通过挂钩AssemblyResolve
事件破坏了这个工作,但这导致了其他问题。普通程序集和插件都有可能引用他们自己的同名命令程序集的副本 - 可能每个程序集都有不同的版本。或者也许是一个名称相同但内容完全不同的程序集。覆盖
AssemblyResolve
,插件的副本将始终首先加载。不是真的担心这个问题,但从安全角度来看,我认识到插件可能会重写调度器的依赖关系,导致它执行某些恶意的事情,或者反映到常见的程序集中并获取内部消息。
所以我决定,也许正确地做到这一点的唯一方法是根本就没有做到这一点 - 强制清洁的分离,任何组件不能加载到AppDomain中。我不确定要做什么最好的方法是什么,或者即使这是最好的方法。
您认为如何?