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

7
当我在Motorola MC3100(仅限CE 6.0版本)上退出我的.NET CF 3.5应用程序时,我会收到错误消息“应用程序xxx遇到严重错误并需要关闭”。然后我需要热启动设备才能使应用程序再次工作。
这段代码在应用程序关闭之前运行良好,只有在应用程序控件上设置字体时才会出现故障。在所有其他我尝试过的使用.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);
}

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

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

还有其他人见过这样的情况吗?似乎与控件没有正确处理这些版本的字体有关。


如果您将该代码移动到通过Application.Run启动的简单表单中,它是否仍然存在该问题? - tcarvin
是的,它确实可以。我从完整的应用程序开始,逐步剥离代码,直到将问题隔离到那几行代码。 - skeeve
经过数小时的调试,我现在还是停留在同一个点上。你找到解决问题的方法了吗? - Louis Haußknecht
到目前为止,我最好的解决方案是回退到CF 2.0。 - skeeve
8个回答

2
我遇到了完全相同的问题。 尝试了以下操作(没有解决问题):
  • 删除所有new Font()语句
  • 使用Form.Close()而不是Application.Exit()
  • 将整个应用程序移至.NET CF 3.5
  • 尝试删除SQLite依赖项
我们唯一有效的解决方案(虽然不是“美观”的解决方案)是在MainForm.Closed()中使用以下命令。
Process.GetCurrentProcess().Kill()

1
我曾经遇到过与MC3190完全相同的问题。我找到的解决方法是通过将每个实例添加到全局列表中来跟踪应用程序中打开的所有表单,并在应用程序退出时循环遍历该列表并对列表中的每个项目调用Form.Dispose。这让我苦恼了几个月。

0
我们遇到了同样的问题,并在 MainForm.Closed() 中使用这行代码解决了它。
Process.GetCurrentProcess().Kill()

0
你应该创建一个表单并在Application.Run()上下文中运行你的代码。在Run结束时,许多资源会被“魔法”般地释放。否则,你必须处理需要处理的每个资源。

0

1
请注意,您引用的博客文章已经非常过时了。 - Daniel Hilgarth

0

我们在运行Windows CE 6.0 / .NET 3.5 CF的Motorola MC3190设备上遇到了这个问题。几个月来,我们一直在关闭应用程序时遇到间歇性致命错误对话框。从ThreadAbort异常到确保每个资源都被正确处理,我们尝试了所有可能的选项。

通常,如果设备没有特定的字体或者正在尝试访问一个未被识别的字体,它会默认使用Arial字体。然而,在MC3190上,如果字体无法识别,设备将显示致命错误对话框,并在退出应用程序后冻结。这导致用户必须进行热启动(有时是冷启动)。

我们提出了两种解决方案:

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

0

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

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

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


0

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

我通过以下解决方案成功解决了这个问题。

我的应用程序在模态子窗体中使用Application.exit(),似乎无法很好地处理字体使用的某些非托管资源。

在我的情况下,精确的原因是在我的主窗体中使用new Font(...)。在模态子窗体中使用它不会引起任何问题。

将application.exit()带回主窗体也不起作用,显式释放字体资源也不起作用(我尝试了很多次)。

最后,我找到的唯一解决方案是通过关闭主窗体而不是使用application.exit()来退出应用程序,这样做效果很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接