首页 > 解决方案 > 使用 Compact Framework 3.5 的 wince 应用程序中的资源损坏

问题描述

我正在维护一个在紧凑框架 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-frameworkwindows-ce

解决方案


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


推荐阅读