8

我正在为专有的 Windows CE 4.2 设备编写 C# 应用程序(对此我没有规格或几乎任何其他信息。我可以访问文件系统,基本上就是这样。)我也无法得到原厂商的支持。

现在,我可以很好地安装 .NET Compact 框架,并且一切正常。但是每隔一段时间,当设备重置时,它会删除框架、GAC 以及与之相关的所有内容。

我知道这不仅仅是硬重置跳回出厂默认设置,因为:

  1. 它记得注册表设置(如果我再次尝试安装,它说框架已经安装,并询问我是否要重新安装。显然注册表项仍然存在)
  2. 即使我将框架安装到可移动闪存卡上,文件也会被删除。(但是,存储卡上的其他文件将被保留)

我知道没有什么可做的,但也许一些 Windows CE 专家能够告诉我为什么会发生这种情况,以及是否有一些理智的方法可以避免它。我对 Windows CE 了解不多,所以就我所知,这可能是完全标准的行为。

就此而言,有关如何自己进一步解决此问题的任何建议?目前,我能看到的最佳解决方案是在每次启动时简单地重新安装所有内容,但这似乎有点笨拙。

编辑: 重置后,文件系统根目录中的 GACLOG.TXT 包含

CGACUTIL:初始化 2008 年 12 月 8 日

20:43:57.000 CGACUTIL:初始化

2008 年 12 月 8 日 20:43:57.000

删除 Microsoft .NET CF 3.5.GAC

2008 年 12 月 8 日 20:43:57.000 CGACUTIL:完成

2008 年 12 月 8 日 20:43:57.000

2008 年 12 月 8 日 20:43:57.000 退出

所以,是的,它肯定会删除 GAC。为什么,以及如何阻止它?

4

5 回答 5

13

您在此处看到的一些 Windows CE 和 CF 行为提供了这种行为。不幸的是,没有真正好的解决方案,但我至少可以给你一些指导。

  1. Windows CE 存储当前对象存储,包括文件系统中的文件,而不是专门存储在 RAM 中的持久存储上。这包括添加到 \Windows 文件夹的任何文件和/或文件夹(这在您的情况下是关键)。当设备断电时——通常是在软复位或硬复位中,这些数据会丢失。
  2. CE 注册表可以(并且可能在您的设备上)存储在持久存储中。这可能在文件系统中(作为配置单元)或在某个不可见的位置(OEM 可以通过两种不同的方式存储它)。这不会在重置时丢失。只有已保存且未刷新的项目会丢失。
  3. 作为 #2 的附录 - 调用 RegFlushKey API 时会刷新注册表更改。安装 CAB会自动调用它(所以安装 CF 会这样做)。一些 OEM 还选择在定期计时器上刷新。
  4. 当 CF GAC 的项目不在图像中时,该文件将移动到 \Windows 文件夹。当组件被卸载时,它们被放回(我在几年前向 CF 团队抱怨过,但无济于事)。

这意味着如果您将 CF 安装到存储卡并运行您的应用程序,则会发生以下情况:

  1. CF 文件在解压 CAB 期间被复制到持久存储
  2. 安装 reg 键是写的
  3. 注册表已刷新(已保存)
  4. 应用程序运行
  5. CF 文件被移动(未复制)到易失性的 \Windows。

现在,如果您在加载 CF 程序集时重置设备 - 噗!没有更多的CF。您的应用程序在存储卡上,但不在 GAC 中,因此它仍然存在但无法再运行。

hack 解决方案:使用本机应用程序“引导”来启动您的应用程序。让它在运行时检查 \Windows 中的 CF 文件,如果它们不存在,则从持久存储中的某个位置安装 CF CAB(将其标记为只读,以便 wceload 不会删除它)。

另一种选择是将 CF 程序集与您的应用程序一起分发,而不是 GAC 它们。

于 2008-12-09T02:27:10.517 回答
1

我知道这是一个非常古老的问题,但是由于我遇到了与问题中提到的相同的问题,因此我进行了大量研究以使其正常工作。我设法在不使用本机引导应用程序的情况下做到了。

1)我事先使用MSCEInf提取了CF cab。我复制了提取的数据(其中包含一个 \Windows 文件夹)和 SD 卡上的原始 cab,并在完全启动后将其插入我的设备中。

2) 现在,首先安装 cab,在同一张 SD 卡或其他一些 NAND 存储上选择一个空文件夹(如果需要,创建一个)。

3) 将之前从 CF cab 中提取的 \Windows 文件夹的内容复制到安装 CF 的同一文件夹中。如果提示要求覆盖任何文件,请始终选择“否”。

4) 确保任何使用/需要 CF 的应用程序都位于同一文件夹内。您也可以将属于应用程序的任何子文件夹原封不动地放在那里。

无论如何,这对我有用。应用程序继续工作,重启后也是如此。

希望这可以帮助!

于 2013-01-07T11:19:33.513 回答
0

我认为您需要在安装某些内容后运行 RegSave 以保存注册表设置。我必须在较旧的(.Net 之前)版本的 Windows CE 中执行此操作。

于 2008-12-08T19:22:10.700 回答
0

在我的 DataLogic Memor CE 上,我现在可以通过手动保存“会话”(无论这意味着什么)来使新的 .Net 安装在冷启动时存活下来。它位于此处:(
Start | Settings | Control Panel | Files Admin | Save session
按下“保存会话”按钮后对话框仍然打开,但您可以关闭该对话框。)

这(显然)仍然需要手动操作,所以这只是另一种解决方法。
只申请几台设备(在开发/试用期间)会更快,但额外的安装文件或“ctacke”的黑客代码可能更适合大容量。

它也确实意味着有一种方法可以通过软件使新的 .Net 安装持久化。所以也许有人可能会被触发想出如何做到这一点,并与世界分享?

PS:我不知道这个手动保存有多通用(如果它也适用于其他设备或其他品牌或其他 CE 版本)。我也不知道它是否是干净启动持久的。

于 2011-10-26T08:48:00.723 回答
0

我已经集思广益了几个小时,终于开始为基于 WinCE 7 的硬件设备配置和项目构建编写用户指南。将很快推出。感谢 SO 参与我的研究

于 2015-01-09T00:50:15.600 回答