防止WinForms中的子控件引发异常

防止WinForms中的子控件引发异常,winforms,exception-handling,Winforms,Exception Handling,我正在编写一个基于WinForms的IDE风格的应用程序。作为该应用程序的一部分,它加载插件,插件实现一个名为IFeature的接口。功能由主IDE框架通过MEF加载,然后要求实例化控件的实例,然后将其添加到选项卡页面以形成插件的主工作面。到目前为止还不错 我现在正在努力保护IDE不受实现糟糕的插件的影响,而我对如何做到这一点没有什么好主意。例如,如果一个插件是一个抛出异常的按钮,那么IDE框架代码根本不包含在该调用堆栈中,因此我没有地方注入try-catch。我已连接到AppDomain.Cu

我正在编写一个基于WinForms的IDE风格的应用程序。作为该应用程序的一部分,它加载插件,插件实现一个名为
IFeature
的接口。功能由主IDE框架通过MEF加载,然后要求实例化
控件的实例,然后将其添加到选项卡页面以形成插件的主工作面。到目前为止还不错

我现在正在努力保护IDE不受实现糟糕的插件的影响,而我对如何做到这一点没有什么好主意。例如,如果一个插件是一个抛出异常的按钮,那么IDE框架代码根本不包含在该调用堆栈中,因此我没有地方注入try-catch。我已连接到
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException
事件,它们提供了针对以这种方式引发的异常的顶级保护,但是我希望能够通过一些上下文捕获它们,这样异常就可以绑定到导致问题的
IFeature
实例

我的想法是创建一个派生自
控件的类,然后使用各种方法并实现try-catch,但是

a。看起来很笨拙。
B无法防止控制装置反过来破坏该方法。
C将阻止使用任何非自定义控件(例如,
面板

是否有任何其他方法可以用于为我的框架提供更接近于原因的保护,或者我是否仍在处理上述范围非常广泛的事件

谢谢


马特

总的来说,我不会因此给自己带来太多负担

只需告诉插件开发人员,当您捕获到他们的控件泄漏的异常时,您将删除对该控件的所有引用

做任何其他事情都太难了,因为您必须设想控件可能会做错的任何事情

对于非UI插件,我会杀死appdomain


删除所有引用可能不那么安全,这可能就是为什么许多允许UI插件的程序不允许插件绘制UI,而是根据插件通过界面建议的内容绘制插件的UI。

一般来说,我不会因此而给自己带来太多负担

只需告诉插件开发人员,当您捕获到他们的控件泄漏的异常时,您将删除对该控件的所有引用

做任何其他事情都太难了,因为您必须设想控件可能会做错的任何事情

对于非UI插件,我会杀死appdomain


删除所有引用可能不那么安全,这可能就是为什么许多允许UI插件的程序不允许插件绘制UI,而是根据插件通过界面建议的内容绘制插件的UI。

我的印象是,您无法在同一表单上为控件分离AppDomains-我错过什么了吗?谢谢,真的。对于非UI插件,我会杀死appdomain。对于UI控件,我只需删除对它的引用。这并不安全,可能也是为什么许多允许用户界面插件的程序不允许用户界面由插件绘制,而是根据插件通过界面的建议绘制插件的用户界面。我的印象是,你不能在同一表单上为控件分离应用域-我是否遗漏了什么?谢谢,真的。对于非UI插件,我会杀死appdomain。对于UI控件,我只需删除对它的引用。这就不那么安全了,而且可能是为什么许多允许UI插件的程序不允许插件绘制UI,而是根据插件通过接口的建议绘制插件的UI。