我有一个WinForms应用程序。它被写入磁盘。我从磁盘运行应用程序并从CD弹出磁盘。然后我采取例外:驱动器中没有磁盘。请将磁盘插入驱动器。如何捕获此异常并正确关闭我的应用程序?
答案 0 :(得分:4)
你应该尝试检测cd弹出。这是一个工作样本:publicjoe.f9.co.uk/csharp/snip/snip002.html
答案 1 :(得分:3)
这是任何类型的程序的一般问题,不是特定于Winforms应用程序。它与创建流程的方式有关。 Windows创建了一个所谓的内存映射文件,它将文件中的字节映射到进程的地址空间。这是从文件读取数据的一种非常有效的方法,只有在实际需要数据时才会发生磁盘读取。当程序执行跳转到特定的代码块,或者JIT编译器需要IL作为方法时,在尚未读取数据时会生成页面错误。操作系统通过从文件中读取块来解决它。您只需为实际运行的代码付费。
另一个主要好处是当系统处于压力之下并且需要太多RAM来保持进程运行时。内存管理器从RAM中删除页面,为需要CPU的进程腾出空间。这些页面通常写入页面文件。但是,当它们来自EXE文件时,这是不必要的。它可以简单地丢弃它们,并通过重新读取文件来恢复它们。
您可能会看到这导致的结果:当您弹出磁盘时,从EXE文件加载页面不再有效。 Windows会注意到这一点并显示对话框。这是一个非常低级别的错误处理机制,您无法将其陷入进程本身。这不起作用,因为这需要在程序中执行代码。无法再从磁盘加载的代码。
您可以通过pinvoking SetErrorMode()来抑制错误。不确定,从未尝试过。但这并没有真正解决任何问题,可能发生的下一个最好的事情是Windows以一个模糊的错误终止程序。唯一合理的解决方案是让用户按照Windows的要求放回磁盘,或者从媒体运行安装程序,以便在硬盘驱动器上创建程序副本。
答案 2 :(得分:2)
使用EDITBIN /SWAPRUN告诉Windows您的可执行文件位于可移动设备上。它会在运行之前将其复制到交换文件中。
这是您通常为(例如)安装程序所做的事情。如果您依赖其他DLL,我不确定这是否有效,但我认为它确实如此。
对于其他资源,您希望在初始化期间尽快将它们复制到临时位置。
或者,您可以调用SetErrorMode来禁用消息框并正确处理错误。
答案 3 :(得分:0)
您可以像这样修改Program.cs:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
// Display the exception to the end user.
}
finally
{
// Do your cleanup here.
}
}
这应该捕获您在应用程序本身中没有捕获的所有异常。