CE 6.0 / .NET CF 3.5应用程序遇到严重错误(MC3100)

时间:2012-05-22 19:47:39

标签: c# .net compact-framework windows-ce

当退出Motorola MC3100上的.NET CF 3.5应用程序(仅限CE 6.0版本)时,我收到错误消息"应用程序xxx遇到严重错误,需要关闭"。然后我需要热启动设备以使应用程序再次工作。

此代码在应用程序关闭之前正常工作,并且只有在应用程序中的控件上设置了字体时才会失败。在.NET CF 2.0以及我使用.NET CF 3.5尝试的所有其他Motorola,Intermec,Psion,HHC设备上,一切都运行良好。

这是我目前的测试代码:

[MTAThread]
static void Main()
{
  Control oCtrl = new Control();
  oCtrl.Font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Bold);

  // Setting the controls font to null works
  // oCtrl.Font = null;  Works

  // Setting the Control to null does not work, still get error
  // oCtrl = null;       Doesn't work

  // Setting a font, not on a control, also works fine.
  // System.Drawing.Font font = new System.Drawing.Font("Tahoma", 10F, System.Drawing.FontStyle.Bold);
}

我看到了一些似乎相关的链接:

但到目前为止,我发现的唯一建议是消除应用程序中的字体。在这种情况下,设置字体的位置太多,包括链接的程序集,这是不可能的。

有没有人见过这样的事情。这似乎与控件没有正确处理这些版本上的字体有关。

8 个答案:

答案 0 :(得分:2)

我遇到了完全相同的问题。 试过以下(没有解决问题):

  • 删除所有new Font()语句
  • 使用Form.Close()代替Application.Exit()
  • 将整个应用程序移至.NET CF 3.5
  • 尝试删除SQLite依赖项

最终适用于我们案例的唯一解决方案(但它不是“漂亮”的解决方案),是MainForm.Closed()

中的以下命令
Process.GetCurrentProcess().Kill()

答案 1 :(得分:1)

我对MC3190有这个问题。我找到的解决方案是通过将每个实例添加到全局List并在应用程序退出循环列表并在列表中的每个项目上调用Form.Dispose来跟踪应用程序中打开的所有表单。几个月来一直强调我。

答案 2 :(得分:0)

我遇到了同样的问题:带有wince6的Motorola MC3100在运行独立时仅在应用程序出口处崩溃,并且在连接VS调试器的情况下运行时没有崩溃。崩溃时,操作系统是HS,唯一的解决方案是冷挂设备。

我设法通过以下解决方案处理它。

我的应用程序在模式子表单中使用Application.exit(),似乎它不能很好地处理字体使用的一些非托管资源。

在我的情况下,确切的原因是在我的主窗体中使用新的字体(...)。在模态子表单中使用它不会导致任何问题。

在主窗体中返回application.exit()也不起作用,也没有明确地处理字体资源(我以这种方式进行了很多尝试)。

最后,我发现唯一可行的方法是通过关闭mainform而不是使用application.exit()来退出应用程序,并且它运行良好。

答案 3 :(得分:0)

建议不要使用Application.Exit()来关闭应用程序。关闭所有打开的表单以关闭应用程序。

http://blogs.msdn.com/b/tom_krueger/archive/2005/02/24/379678.aspx

答案 4 :(得分:0)

我们在运行Windows CE 6.0 / .NET 3.5 CF的Motorola MC3190设备上遇到此问题。几个月来,我们在关闭申请时遇到了间歇性的致命错误对话。从ThreadAbort异常中探索了每个可能的选项,以确保每个资源都得到妥善处理。

通常情况下,如果某个设备没有特定字体或者正在尝试访问一个碰巧无法识别的字体,则默认为Arial。但是,对于MC3190,如果无法识别字体,设备将显示致命错误对话框并在退出应用程序后冻结。这导致用户必须进行热启动(有时是冷启动)。

我们想出了两个解决方案来解决这个问题:

  1. 将应用程序范围的字体设置为支持的字体(用Arial替换Tahoma)
  2. 通过使用支持的字体实例化或设置为null来重置所有全局Font对象。

答案 5 :(得分:0)

您应该创建一个表单并在Application.Run()上下文中运行您的代码。在运行结束时,许多资源被魔术"处理掉。否则,您必须处置需要处置的所有资源。

答案 6 :(得分:0)

我们遇到了同样的问题,并使用MainForm.Closed()

中的这行代码解决了这个问题
Process.GetCurrentProcess().Kill()

答案 7 :(得分:0)

我在使用.NET Compact Framework 3.5的Motorola 9190-G上遇到了同样的问题。有时我必须热启动设备,因为它会在关闭我的应用程序后冻结。

我能够通过指定ListView包含在Constructor中的形式字体来解决问题,该字体为Arial,10pt,Regular。然后我以编程方式将字体设置为我想要的字体。例如,myListView.Font = new System.Drawing.Font("Tahoma", 11F, System.Drawing.FontStyle.Bold);

如果我将字体设置为任何其他字体/字体样式/大小组合,我会在关闭移动设备上的应用程序时收到“程序遇到严重问题并且必须关闭”错误消息。