【问题标题】:corrupted resources in wince application using Compact Framework 3.5使用 Compact Framework 3.5 的 wince 应用程序中的资源损坏
【发布时间】:2026-01-03 00:40:02
【问题描述】:

我正在维护一个基于紧凑框架 3.5 开发的 windows ce 窗体应用程序 我正在努力解决的问题是,在运行几天后,在 Windows ce 6.0 设备上运行的应用程序崩溃了。它提出了一个例外:

SerializationException 255 at Systems.Resources.ResourceReader.ParseMessageEnd() at
System.Resources.ResourceReader.LoadBitmap(Int 32 typeIndex) etc

然后我使用 .Net Reflector 分析了设备上运行的 exe 文件,我发现一些资源已损坏并且它们具有值:Invalid resource TypeCode '-1' and the type is System.BadImageFormatException, mscorlib, Veersion=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 whilst the non corrupted resources have Version=2.0.0.0

文件损坏和版本更改的方式真的很奇怪。 我还在代码中发现了一个永远运行的 200 毫秒计时器,并且在该计时器中还有这段代码导致了 ui 滞后:

if (Global.ParSotteraneiQuadro.typepompa == ClParSottQuadro.EnTipoPompa.PNEUM)
        {
            ImagesMOTORE[0] = Resources.pump_OFF;
            ImagesMOTORE[1] = Resources.pump_OFF;
            ImagesMOTORE[2] = Resources.pump_ON;
            ImagesMOTORE[3] = Resources.pump_ON;

            btPompa.ImageBack = Resources.pump_OFF;
            btPompa.ImageFore = Resources.pump_ON;

            MemImageMOTORE = new ClassMemImage(ImagesMOTORE);

            ImagesTempWait[0] = Resources.anim12_230;
            ImagesTempWait[1] = Resources.anim22_230;
            ImagesTempWait[2] = Resources.anim32_230;
            ImagesTempWait[3] = Resources.anim42_230;
            ImagesTempWait[4] = Resources.sfondo_arancio; // arancione vuoto
            ImagesTempWait[5] = Resources.sfondo_red; // rosso vuoto
            ImagesTempWait[6] = Resources.warning_230;
            ImagesTempWait[7] = Resources.ok_230;
            ImagesTempWait[8] = Resources.eco_top;
            ImagesTempWait[9] = Resources.abil_pompa_pump;
            ImagesTempWait[10] = Resources.abil_24VOLT_sfumato;
            ImagesTempWait[11] = Resources.ok_230_giallo;

            MemImageWaitTemp = new ClassMemImage(ImagesTempWait);
        }
        else
        {
            ImagesMOTORE[0] = Resources.motor_OFF;
            ImagesMOTORE[1] = Resources.motor_OFF;
            ImagesMOTORE[2] = Resources.motor_ON;
            ImagesMOTORE[3] = Resources.motor_ON;

            btPompa.ImageBack = Resources.motor_OFF;
            btPompa.ImageFore = Resources.motor_ON;

            MemImageMOTORE = new ClassMemImage(ImagesMOTORE);

            ImagesTempWait[0] = Resources.anim12_230;
            ImagesTempWait[1] = Resources.anim22_230;
            ImagesTempWait[2] = Resources.anim32_230;
            ImagesTempWait[3] = Resources.anim42_230;
            ImagesTempWait[4] = Resources.sfondo_arancio; // arancione vuoto
            ImagesTempWait[5] = Resources.sfondo_red; // rosso vuoto
            ImagesTempWait[6] = Resources.warning_230;
            ImagesTempWait[7] = Resources.ok_230;
            ImagesTempWait[8] = Resources.eco_top;
            ImagesTempWait[9] = Resources.abil_pompa;
            ImagesTempWait[10] = Resources.abil_24VOLT_sfumato;
            ImagesTempWait[11] = Resources.ok_230_giallo;

            MemImageWaitTemp = new ClassMemImage(ImagesTempWait);
        }

有人遇到过这样的事情吗?谢谢你的帮助

【问题讨论】:

    标签: c# compact-framework windows-ce


    【解决方案1】:

    IIRC 资源加载到可写内存中,这意味着如果以错误的方式使用指针,应用程序可能会覆盖该数据。通常您不会在 .NET 中直接访问指针,但那些“Mem”类可能需要更多调查。 并且只是一个小问题,也许只有当 Global.ParSotteraneiQuadro.typepompa 自上次检查以来发生了变化时,才应该完成所有的分配和分配。

    【讨论】:

    • 感谢您的建议。您是否知道在 wince 上我是否可以在插入 USB 密钥后自动运行 bat 文件?
    • 是的,文件需要被命名为 autostart.exe 并且存在于 CPU 特定的目录中,例如 \2577。
    【解决方案2】:

    在插入时从外部存储自动运行:

    “在 CF 卡上自动运行应用程序 从 Windows CE 3.0 开始,当将 Compact Flash 存储卡插入设备时,可以让应用程序从其运行。这允许应用程序从 Compact Flash 卡自动安装。 要将应用程序设置为自动运行,您必须将应用程序放置在应用程序所针对的 CPU 的特定文件夹中。文件夹名称基于调用 GetSystemInfo 返回的 SYSTEM_INFO 结构的 dwProcessorType 成员中返回的 CPU 编号。表 3.7 显示了可能的值及其相关常数。 持续的 价值 PROCESSOR_MIPS_R4000 4000 PROCESSOR_HITACHI_SH3 10003 PROCESSOR_HITACHI_SH3E 10004 PROCESSOR_HITACHI_SH4 10005 PROCESSOR_MOTOROLA_821 821 处理器_SHx_SH3 103 处理器_SHx_SH4 104 PROCESSOR_STRONGARM 2577 处理器_ARM720 1824 处理器_ARM820 2080 处理器_ARM920 2336 PROCESSOR_ARM_7TDMI 70001 表 3.7。处理器值和相关常量 因此,如果您希望您的应用程序自动运行并且该应用程序针对 MIPS 进行编译,您应该将您的应用程序重命名为 autorun.exe 并将其放在名为 \4000 的文件夹中,例如 \4000\autorun.exe。 如果您的应用程序是针对 CEF(通用可执行格式)编译的,您应该将 autorun.exe 文件放在名为 \0 的文件夹中,例如 \0\autorun.exe。 应用程序 autorun.exe 在插入紧凑型闪存卡时传递命令行参数“install”,在移除卡时传递命令行参数“uninstall”。这允许您的 autorun.exe 应用程序在卡被移除时自行卸载。 ……” [来自书籍:Windows CE 3.0 应用程序编程]

    【讨论】: