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

时间:2008-12-08 19:14:54

标签: compact-framework windows-ce

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

现在,我可以很好地安装.NET Compact框架,一切都可以运行一段时间。但每隔一段时间,当设备重置时,删除框架,GAC,以及与之相关的所有内容。

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

  1. 它记得注册表设置(如果我再次尝试安装,它说已经安装了框架,并询问我是否要重新安装。显然注册表项仍然存在)。
  2. 即使我将框架安装到可移动闪存卡上,文件也会被删除。 (但是,存储卡上的其他文件保持不变)
  3. 我知道没有太多可继续下去,但也许一些Windows CE专家能够告诉我为什么会发生这种情况,并且如果有一些理智的方法可以避免它。我对Windows CE知之甚少,所以据我所知,它可能是完全标准的行为。

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

    修改 重置后,在文件系统的根目录中找到的GACLOG.TXT包含

      

    CGACUTIL:初始化2008年8月12日

         

    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:

         

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

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

5 个答案:

答案 0 :(得分:12)

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

  1. Windows CE存储当前对象存储,包括文件系统中的文件,而不是特定于RAM中的持久存储。这包括添加到\ Windows文件夹的任何文件和/或文件夹(这在您的案例中是关键)。当设备电源丢失时 - 通常在软复位或硬复位时,此数据将丢失。
  2. CE注册表可以(并且可能在您的设备上)存储在持久性存储中。这可能在文件系统中(作为配置单元)或在某些不可见的位置(OEM可以存储两种不同的方式)。重置时丢失。只有已保存且未刷新的项目才会丢失。
  3. 作为#2的附录 - 在调用RegFlushKey API时刷新注册表更改。安装CAB 自动会调用此方法(因此安装CF会这样做)。一些原始设备制造商也选择在定期计时器上冲洗它。
  4. 当CF GAC不在图像中的项目时,文件移动到\ Windows文件夹。卸载组件时,他们放回(我多年前向CF团队抱怨无济于事)。
  5. 这意味着如果您将CF安装到存储卡并运行您的应用程序,则会发生这种情况:

    1. 在解压缩CAB期间将CF文件复制到持久存储
    2. 编写安装注册密钥
    3. 注册表已刷新(已保存)
    4. App运行
    5. 将CF文件移动(不复制)到\ Windows,这是不稳定的。
    6. 现在,如果在加载CF组件时重置设备 - 噗!不再是CF.您的应用程序位于存储卡上,但不在GAC中,因此它可以存活但无法再运行。

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

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

答案 1 :(得分:1)

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

1)我使用MSCEInf预先提取CF驾驶室。我将提取的数据(包含\ Windows文件夹)和SD卡上的原始驾驶室复制,如果已完全启动,则将其插入我的设备。

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

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

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

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

希望这有帮助!

答案 2 :(得分:0)

我认为您需要运行RegSave以在安装后保存注册表设置。我不得不在Windows CE的旧版本(pre .Net)中执行此操作。

答案 3 :(得分:0)

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

这(显然)仍然需要手动操作,所以这只是另一种解决方法 申请一些设备(在开发/试用期间)的速度更快,但额外的安装文件或'ctacke'的黑客代码对于更大的卷可能更好。

这也意味着有一种方法可以通过软件使新的.Net安装持久化。那么也许有人可能会被触发去弄清楚如何做到这一点,并与世界分享?

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

答案 4 :(得分:0)

我已经集思广益了几个小时,最后开始编写基于WinCE 7的硬件设备配置和项目构建的用户指南。即将推出。非常感谢您成为我研究的一部分