永远不会挂的.NET应用

如何创建一个永远不会关闭的.NET应用呢?
这对于一个只允许用户与预定程序集交互的封闭系统来说是很常见的一种情况。换句话说,用户永远也不能使用操作系统的功能,尤其是,他们不能安装或者更新软件组件。
建立一个基于Windows的封闭系统并不是件容易的事。对于我们的XP嵌入式系统,有如下方法:
1.禁止从周边设备(如光驱、USB设备等)启动。
2.禁止访问BIOS,如果能访问BIOS,那么第一条就可以生效了。
3.阻止即插即用设备自动安装运行。
4.不能运行资源管理器,没有桌面和开始菜单。
5.禁止使用Ctrl-Alt-Del键调用任务管理器。
6.禁用Alt-Tab键,使用户不能切换应用程序焦点。
7.确保第一用户接口程序一直运行。
8.当系统关闭时,无需用户交互,所有UI组件必须全部退出。
.NET应用的挑战之一就是如何处理不可预料的异常。首要的就是需要有一种方法来捕获所有异常。好的,现在应该意识到了,你的应用程序的运行条件相当苛刻。在正常关机时,你必须可以恢复一些工作,毕竟,让程序一直运行着并不是一个好主意。
那就意味着,你必须重新启动你的程序。对于一个WinForms应用程序,可以这样做:
Application.Restart();
Application.Restart()本质上是调用了Application.Exit(),它会尽量将所有UI线程正常关闭。现在的问题就是,当有检测硬件设备的后台工作线程,并且这些线程没有立即响应时,你的应用程序可能就被挂起。
另一个问题是.NET应用和COM组件交互。我遇到过这种情况,所有的托管线程都会通过Application.Exit()正常退出,但是非托管线程仍在运行。这是不能接受的。
下面的方法可以确保应用程序正常重启:
Process.Start(Application.ExecutablePath);
Environment.Exit(0);
Environment.Exit(0)调用时很苛刻的,但是这是我知道的唯一一种确保应用真的退出的方法。如果你想要一个windows应用的事件日志并且转存你的应用,你可以用Environment.FailFast()代替。

posted on 2009-09-20 21:38  火柴没帽  阅读(451)  评论(0编辑  收藏  举报

导航