7

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

此代码在应用程序关闭之前工作正常,并且仅在应用程序中的控件上设置字体时才会失败。一切在 .NET CF 2.0 和所有其他摩托罗拉、Intermec、Psion、HHC 设备上也能正常工作,我用 .NET CF 3.5 尝试过。

这是我当前的测试代码:

[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);
}

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

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

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

4

8 回答 8

2

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

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

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

Process.GetCurrentProcess().Kill()
于 2013-09-06T21:08:58.690 回答
1

我在 MC3190 上遇到过这个确切的问题。我发现的解决方案是跟踪应用程序中打开的所有表单,方法是将每个实例添加到全局列表中,并在应用程序退出时循环遍历列表并在列表中的每个项目上调用 Form.Dispose。几个月来一直让我感到压力。

于 2013-11-30T14:53:53.200 回答
0

我遇到了同样的问题:摩托罗拉 MC3100,带有 wince6,仅在独立运行时在应用程序退出时崩溃,在附加 VS 调试器运行时没有崩溃。崩溃时,操作系统是 HS,唯一的解决方案是冷启动设备。

我设法用以下解决方案来处理它。

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

在我的情况下,确切的原因是在我的主要形式中使用 new Font(...) 。在模态子表单中使用它不会导致任何问题。

在主窗体中恢复 application.exit() 也不起作用,也没有显式地处理字体资源(我做了很多面向这种方式的尝试)。

最后,我发现唯一可行的解​​决方案是通过关闭主窗体而不是使用 application.exit() 来退出应用程序,并且效果很好。

于 2013-02-06T13:39:53.643 回答
0

Application.Exit() 不推荐关闭应用程序的方法。关闭所有打开的表格以关闭应用程序。

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

于 2013-03-28T11:44:32.340 回答
0

我们在运行 Windows CE 6.0 / .NET 3.5 CF 的摩托罗拉 MC3190 设备上遇到了这个问题。几个月来,我们在关闭应用程序时遇到了间歇性的致命错误对话框。从 ThreadAbort 异常中探索了每个可能的选项,以确保正确处理每个资源。

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

针对这个问题,我们提出了两种解决方案

  1. 将应用程序范围的字体设置为受支持的字体(将 Tahoma 替换为 Arial)
  2. 通过使用支持的字体实例化或设置为 null 来重置任何全局 Font 对象。
于 2013-12-06T18:57:50.353 回答
0

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

于 2014-08-29T14:10:56.600 回答
0

我们遇到了同样的问题,用 MainForm.Closed() 中的这行代码解决了

Process.GetCurrentProcess().Kill()
于 2014-09-04T09:33:55.843 回答
0

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

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

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

于 2015-03-26T15:21:31.337 回答