最近在做一个插件式客户端框架,系统要求UI插件要运行在一个独立的AppDomain中。不过这里遇到一个恶心的问题:在AppDomain中如何捕获异常。也许您会说使用Application.ThreadException或者Appdomain的UnhandledException事件啊,不过这两种方法我实验都是不成功。Application.ThreadException这个是不能跨domain的,对于独立AppDomain中异常无法捕获,而UnhandledException这个虽然能捕获到Exception但是无法阻止其继续上抛,也就是说用户还是会看到异常的提示。经过反复的实验和上网查找资料都没有找到解决方法,就在我丧失信心的时候雨痕老大出现了。其实解决思路还是Application.ThreadException不过使用方法有点特别,首先Application.ThreadException是不能跨域访问的因此需要在新建的domain中使用Application.ThreadException,其次是domain中跑的程序必须通过DoCallBack回调才行(不明白为什么非要这样)反正是解决了。有需要的朋友可以在这里看下demo。说明性代码如下:
- private void button2_Click(object sender, EventArgs e)
- {
- AppDomain domain = AppDomain.CreateDomain("mydomain");
- //回调方式
- domain.DoCallBack(CallBack);
- }
- private static void CallBack()
- {
- Application.ThreadException += delegate(object sender, System.Threading.ThreadExceptionEventArgs e)
- {
- MessageBox.Show(e.Exception.Message);
- };
- //运行新实例
- Form2 form = new Form2();
- form.Show();
- }