2013-01-19 20 views
1

首先讓我說,對於我的場景,插件將在應用程序啓動時加載,並且在應用程序關閉之前不會被卸載,因此,如果在加載後無法卸載它們,則完全沒問題。我是否真的需要將插件加載到單獨的AppDomain中(根據我的要求)?

那麼我知道,加載插件到他們自己的AppDomain將保護我的應用程序,如果一個插件崩潰,但假設插件不運行非託管代碼,那麼我不能將調用封裝到try/catch塊避免讓我的應用程序崩潰?或者我在這裏錯過了什麼?

我想使用MAF來做到這一點,但是我遇到了遠程處理我的對象的問題。也就是說,在這個時間點上,我沒有任何可用的選項讓他們變得可以遠程觀看。所以我做之前切換到更原始的插件架構誰能告訴我,如果我忘了我爲什麼要加載的插件到一個單獨的AppDomain(或不管我錯對能夠簡單地避免碰撞的任何其他顯著原因使用圍繞調用try/catch塊)?

+1

如果_managed_代碼崩潰怎麼辦?託管代碼很有可能崩潰。如果有,則不能重新加載插件,因爲程序集/類型已被加載到該AppDomain中。 – Oded

+0

@Oded +1這是我沒有想到的一個偉大點。但是,我認爲在這一點上我還是好與客戶的需要,如果一個插件崩潰重新啓動應用程序。 –

回答

1

如果不需要卸載它們,你不需要單獨的AppDomain。

如果發生未處理的異常,AppDomain不保護進程不被殺害。 new Thread(() => { throw null; }).Start()仍然致命。

所以你需要try-catch圍繞插件入口點,你需要他們合作(沒有線程崩潰)。

但是,如果您想中止一些計算,AppDomain很有用。如果您之後立即卸載整個AppDomain,它們是相對安全地調用Thread.Abort的一種方法。

相關問題