c# - 使用 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);
}
有人遇到过这样的事情吗?谢谢您的帮助
解决方案
IIRC 资源被加载到可写内存中,这意味着如果以错误的方式使用指针,应用程序可能会覆盖该数据。通常您不会在 .NET 中直接访问指针,但那些“Mem”类可能需要更多调查。并且只是一个小的不表现,也许只有当 Global.ParSotteraneiQuadro.typepompa 自上次检查以来发生了变化时,才应该完成所有的分配和分配。
推荐阅读
- java - 如何从 java 内核而不是 Android SDK 导入 java.beans 包?
- c# - 使用 powershell 脚本从 c# 代码调用 dll 不起作用
- python - Python Pandas:根据类别的最高频率更改值
- java - 使用 ELSA 序列化在 MapDB 中存储 JSONArray 时出现 org.mapdb.DBException$SerializationError
- mongodb - 如何将 MongoDB Atlas 连接到 GCP(谷歌云平台)?
- java - 如何为简单的离线桌面应用程序存储数据?
- python - FileNotFoundError:找不到模块“caffe2_nvrtc.dll”(或其依赖项之一)。尝试使用带有构造函数语法的完整路径
- azure - ADLS Gen2 中针对即将到来的用户的文件夹级别访问控制
- python - pandas groupby 包含不存在的日期
- vim - 如何在vim中获得删除按钮行为?