Windows CE在重置时删除.NET CF。

8
我正在为一款专有的Windows CE 4.2设备编写C#应用程序(我没有规格或几乎任何其他信息。我可以访问文件系统,那基本上就是这样)。我也无法得到原始制造商的支持。
现在,我可以很好地安装.NET Compact框架,而且一切都正常工作。但是,每隔一段时间,当设备重置时,它会删除框架、GAC和与之相关的所有内容。
我知道这不仅仅是硬重置跳回出厂默认设置,因为:
1. 它记住了注册表设置(如果我尝试重新安装,它会说框架已经安装,并询问是否要重新安装。因此,注册表键仍然存在)
2. 即使我将框架安装到可移动闪存卡上,文件也会被删除。(但存储卡上的其他文件却不受影响)
我知道没有太多线索,但也许一些Windows CE大师能告诉我为什么会发生这种情况,以及如何避免。我对Windows CE并不了解,所以我也不知道这是否是完全标准的行为。
至于如何进一步自己排除故障,有什么建议吗?目前,我能想到的最好的解决方案是在每次启动时重新安装所有内容,但这似乎有点笨拙。
编辑:
重置后,在文件系统根目录下找到的GACLOG.TXT包含以下内容:
CGACUTIL:初始化12/08/2008 20:43:57.000 CGACUTIL:已初始化 12/08/2008 20:43:57.000 CGACUTIL: 删除Microsoft .NET CF 3.5.GAC 12/08/2008 20:43:57.000 CGACUTIL:完成 12/08/2008 20:43:57.000 CGACUTIL: 退出12/08/2008 20:43:57.000
所以,它肯定删除了GAC。但为什么呢?如何停止它?
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. 在解压缩CAB期间,CF文件被复制到持久性存储器中
  2. 安装注册表键
  3. 注册表被刷新(保存)
  4. 应用程序运行
  5. CF文件被移动(而不是复制)到易失性的\Windows文件夹中。

现在,如果您在加载CF程序集时重置设备-菜!没有了CF。您的应用程序位于存储卡上,但不在GAC中,因此可以存活下来,但无法再运行。

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

谢谢。非常有帮助。我明天会在工作中尝试一下,但听起来你已经解决了问题(并且似乎以前也遇到过类似的问题 ;)) - jalf
嗯,我通常会选择前者,并根据设备使用不同的引导程序。但我从来不明白为什么有些设备不听 /silent 或 /noui 或其他我提供的组合。例如,有一次我不得不(呕吐)发送按键以在冷启动和 kiosk 设备上重新安装。 - Quibblesome
4
别让我开始抱怨那个该死的"wceload"。这就是为什么我编写了我们的"CAB安装程序SDK",这样你就可以自己解压CAB并完全控制安装过程。 - ctacke
我曾经认为我已经成功地进行了.NET CF安装持久化,通过将其安装到\Backup\Windows\,该文件夹会在我的设备上自动复制到冷启动时的\Windows\,并将这些GAC文件设置为只读,以防止它们被删除。但是我现在似乎无法再次重现这个过程。太糟糕了! - Yahoo Serious

1

我知道这是一个非常老的问题,但由于我遇到了与问题中提到的相同的问题,所以我进行了大量研究来解决它。而且我成功地做到了不使用本机引导程序。

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

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

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

4)确保使用/需要CF的任何应用程序位于同一文件夹中。您也可以将属于该应用程序的任何子文件夹完整放置在那里。

总之,这对我有用。应用程序继续工作,即使重新启动也是如此。

希望这有所帮助!


0
我已经集思广益了几个小时,最终开始编写一个关于WinCE 7基础硬件设备配置和项目构建的用户指南。很快就会发布。感谢Stack Overflow成为我的研究的一部分。

0

我认为在安装某些东西后,您需要运行RegSave来保存注册表设置。在早期(.Net之前)的Windows CE版本中,我不得不这样做。


虽然情况正好相反。它会保存注册表,但会删除已安装的.dll文件。 - jalf
我明白了。在我使用的旧版本中,每次重新启动后所有内容都会被删除。有一个特定的文件夹,我们会把.cab文件放在里面以重新安装应用程序。这就是我所记得的全部。 - Kosta
没错,但我模糊地记得你也可以把dedab'd文件放在那个文件夹里。找一个其他文件在重启后仍然存在的文件夹。文件夹并不意味着你想象中的那样。层次结构并不是真正的层次结构。这都是为了虚假的“丰富Windows体验”。 - dkretz
我稍微更新了一下我的问题。很明显设备存储不仅仅是被重置了,而且实际上正在运行cgacutil手动删除GAC。 非常感谢迄今为止的建议。(顺便问一下,你所说的dedab'd文件是什么意思?) - jalf
意思是“decab'd - 从出租车中移除”。 - dkretz

0
在我的DataLogic Memor CE上,我现在可以通过手动保存“会话”(不知道是什么意思)使新的.Net安装在冷启动后继续存在。它位于这里:
开始 | 设置 | 控制面板 | 文件管理器 | 保存会话
(按下“保存会话”按钮后,对话框仍然保持打开状态,但您可以关闭该对话框。)
这(显然)仍然需要手动操作,因此这只是另一种解决方法。
对于少量设备(在开发/试用期间),这更快捷,但是额外的安装文件或“ctacke”的黑客代码可能更适合大量设备。
它还意味着有一种通过软件使新的.Net安装持久化的方法。因此,也许有人会被激发去找出如何做到这一点,并与世界分享?
附注:我不知道这种手动保存是否通用(是否适用于其他设备或其他品牌或其他CE版本)。我也不知道它是否具有干净的启动持久性。

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