2012-05-31 24 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。 –