2012-05-31 23 views
1

我在寫一個基於WinForms的IDE風格的應用程序。作爲該應用程序的一部分,它會加載實現了一個名爲IFeature的接口的插件。功能由主IDE框架通過MEF加載,然後要求實例化Control的實例,然後將實例添加到選項卡頁面以形成插件的主要工作表面。到現在爲止還挺好。防止WinForms中子控件拋出的異常

我現在正在努力保護IDE不受惡意實現的插件的影響,而且我完全不知道如何做到這一點。例如,如果一個插件是一個引發異常的按鈕,那麼IDE框架代碼根本就不涉及該調用堆棧,所以我沒有注入try-catch的地方。我已經吸引了AppDomain.CurrentDomain.UnhandledExceptionApplication.ThreadException事件,這些事件爲以這種方式拋出的異常提供了頂級保護,但我希望能夠在某種情況下捕獲它們,以便可以將異常與IFeature實例關聯起來對這個問題負責。

我確實有創造從Control派生的類的想法 - 然後壓倒一切的各種方法和實施的try-catch - 但

一個。似乎笨拙。 b。不能防止控制反過來影響該方法。
c。可以防止使用任何非定製控件(例如,Panel

是否有任何其他方法可用於爲我的框架提供更接近原因的保護,或者我堅持處理非常廣泛的範圍事件如上。

感謝

馬特

回答

1

一般來說,我不會自己負擔太多與此有關。

只要告訴插件開發人員,當您發現他們的控件出現異常時,您將刪除對控件的所有引用。

做任何事情都太難了,因爲你必須設想一下控制可能做錯的一切。

對於非UI插件,我會殺死appdomain。

刪除所有引用可能不那麼安全,這可能是爲什麼許多允許UI插件的程序不允許插件繪製UI,而是基於插件通過接口建議的插件繪製UI的插件。

+0

我的印象是,你不能分開AppDomains的控件在同一個窗體上 - 我錯過了什麼嗎?謝謝。 –

+0

是的。對於非UI插件,我會殺死appdomain。對於一個UI控件,我只是刪除對它的引用。這並不安全,可能爲什麼許多允許UI插件的程序不允許插件繪製UI,而是基於插件通過接口提供的內容爲插件繪製UI。 –