我正在爲自動化調度程序編寫一個插件體系結構,它需要健壯,所以我試圖做ASP.NET/IIS風格的AppDomains - 即每個AppDomain是真的被視爲它們自己獨特的應用程序,它們之間沒有共享對象。完整的ASP.NET風格的AppDomain程序集隔離
我在AppDomainSetup
中設置ApplicationBase
,ConfigurationFile
和ShadowCopyFiles
。
自動化調度程序中有一個常見的程序集,我爲每個插件加載 - 它處理加載插件的主程序集,捕獲未捕獲的異常和記錄。有跡象表明,我已經確定這種方法也有一些不足:
通過設置
ApplicationBase
到插件存儲在何處,共同的組件(駐留在不同的路徑)的任何依賴關係將不再得到解決。我通過掛鉤AssemblyResolve
事件破壞了這個工作,但這導致了其他問題。普通程序集和插件都有可能引用他們自己的同名命令程序集的副本 - 可能每個程序集都有不同的版本。或者也許是一個名稱相同但內容完全不同的程序集。覆蓋
AssemblyResolve
,插件的副本將始終首先加載。不是真的擔心這個問題,但從安全角度來看,我認識到插件可能會重寫調度器的依賴關係,導致它執行某些惡意的事情,或者反映到常見的程序集中並獲取內部消息。
所以我決定,也許正確地做到這一點的唯一方法是根本就沒有做到這一點 - 強制清潔的分離,任何組件不能加載到AppDomain中。我不確定要做什麼最好的方法是什麼,或者即使這是最好的方法。
您認爲如何?