我正在为一个专有的Windows CE 4.2设备编写一个C#应用程序(我没有这些规格或其他任何信息.我可以访问文件系统,基本上就是它.)我也是无法获得原始制造商的支持.
现在,我可以很好地安装.NET Compact框架,一切都可以运行一段时间.但每隔一段时间,当设备重置时,它会删除框架,GAC以及与之相关的所有内容.
我知道这不仅仅是硬重置跳回工厂默认值,因为:
它记得注册表设置(如果我再次尝试安装,它说框架已经安装,并询问我是否要重新安装.所以显然注册表项仍然存在)
即使我将框架安装到可移动闪存卡上,也会删除这些文件.(但是,存储卡上的其他文件是独立的)
我知道没有太多可以继续下去,但也许一些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.为什么,以及如何阻止它?
您在这里看到的一些Windows CE和CF行为会给您这种行为.不幸的是,没有真正好的解决方案,但我至少可以给你一些指导.
Windows CE存储当前对象存储,包括文件系统中的文件,而不是特定于RAM中的持久存储.这包括添加到\ Windows文件夹的任何文件和/或文件夹(这在您的案例中是关键).当设备电源丢失时 - 通常在软复位或硬复位时,此数据会丢失.
CE注册表可以(并且可能在您的设备上)存储在持久性存储中.这可能在文件系统中(作为配置单元)或在某些不可见的位置(OEM可以存储两种不同的方式).这是不输于复位.只有保存但未刷新的项目才会丢失.
作为#2的附录 - 在调用RegFlushKey API时刷新注册表更改.安装CAB会自动调用它(所以安装CF会这样做).一些OEM也选择在定期计时器上冲洗它.
当CF GAC不在图像中的项目时,文件将移动到\ Windows文件夹.卸下组件时它们会被放回(我多年前向CF团队抱怨无济于事).
这意味着如果您将CF安装到存储卡并运行您的应用程序,则会发生以下情况:
在解压缩CAB期间,CF文件被复制到持久存储区
安装注册密钥已写入
注册表被刷新(已保存)
应用运行
CF文件被移动(不复制)到\ Windows,这是不稳定的.
现在,如果你在CF组件加载时重置设备 - 噗!不再是CF. 您的应用程序位于存储卡上,但不在GAC中,因此它可以存活但无法再运行.
黑客解决方案:使用本机应用程序"bootstrap"启动您的应用程序.让它检查\ Windows运行中的CF文件,如果它们不存在,则从持久存储中的位置安装CF CAB(将其标记为只读,因此wceload不会删除它).
另一种选择是使用您的应用程序而不是GAC分发CF程序集.