【问题标题】:Windows CE deletes .NET CF on resetWindows CE 在重置时删除 .NET CF
【发布时间】:2008-12-08 19:14:54
【问题描述】:

我正在为专有的 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:已初始化

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

删除 Microsoft .NET CF 3.5.GAC

12/08/2008 20:43:57.000 CGACUTIL:完成

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

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

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

【问题讨论】:

    标签: compact-framework windows-ce


    【解决方案1】:

    您在此处看到的一些 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. 安装注册密钥已写入
    3. 注册表已刷新(已保存)
    4. 应用运行
    5. CF 文件被移动(未复制)到易变的 \Windows。

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

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

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

    【讨论】:

    • 谢谢。非常有帮助。明天我会在工作中试一试,但听起来你已经成功了(而且你以前被这个咬过;))
    • 是的,前者是我通常使用的不同引导程序,具体取决于设备。我永远不明白的是为什么有些设备不听 /silent 或 /noui 或我提供的任何组合。一方面,我必须(ewwww)发送密钥以在冷启动时重新安装并在设备上自助服务。
    • 甚至不要让我开始处理@%$# wceload 的那部分内容。这就是我编写 CAB 安装程序 SDK 的原因 - 这样您就可以自己解压缩 CAB 并完全控制安装。
    • 我想,我已经完成了 .NET CF 安装,方法是在冷启动时自动(在我的设备上)安装到 \Backup\Windows`, which gets copied to \Windows`,并将这些 GAC 文件设为只读,所以他们不会被删除。但我似乎无法再复制它了。太糟糕了!
    【解决方案2】:

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

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

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

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

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

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

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但情况恰恰相反。它会保存注册表,但会删除已安装的 .dll。
      • 我明白了。在我使用的旧版本中,所有内容都会在重新启动后被删除。有一个特定的文件夹,我们将在其中放置 .cab 文件以重新安装应用程序。我只记得这些了。
      • 对,但我依稀记得您也可以将 dedab 的文件放在该文件夹中。找到一个其他文件通过重新启动保留的位置。文件夹并不意味着你认为他们的意思。层次结构并不是真正的层次结构。一切都是为了虚假的“丰富的 Windows 体验”。
      • 稍微更新了我的问题。很明显,设备存储不仅仅是被重置。它实际上是在运行 cgacutil 来手动删除 GAC。感谢您到目前为止的建议。 (顺便问一下,dedab'd 文件是什么意思?
      • 意思是“decab'd - 从出租车上移除。
      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-13
          相关资源
          最近更新 更多