我们在.Net Compact Framework和Windows Mobile中广泛开展工作.我已经看到很多关于ASP.Net应用程序或其他.Net桌面应用程序开发细节的问题,但没有特定的CF.
移动开发人员在那里可以分享一些事情来开始做,停止做,并避免在Compact Framework中进行开发吗?
当然:
尽可能使用物理设备(不是模拟器)
使用多个设备(不同供应商,不同型号)进行测试
集中测试睡眠/唤醒行为
使用MSTEST单元测试时,请勿使用私有访问器
像瘟疫一样避免使用ActiveSync - 使用CoreCon直接调试
熟悉RPM并尽早开始使用它
尽可能重用对象
避免在Form的ctor中做很多工作 - 为延迟加载或在后台线程中加载它
尽可能按需加载表单(不是一次全部加载)
缓存常用表单,根据需要创建不常用的表单
保持低图像分辨率
如果一个类公开Dispose 使用它.总是.
没有应用程序太小,无法从MVC/MVP模式中受益
不要将Microsoft CAB/SCSF端口用于CF(移植它的人显然从未实际使用过资源有限的设备)
如果您要进行任何远程数据/服务活动,请熟悉"偶尔连接"的概念
停靠和锚定是你的朋友和你的敌人 - 测试运行时屏幕旋转和多个分辨率(即使你认为你不会瞄准它们,因为你可能在这个想法中错了)
请注意,但不要大量投资设备部署包项目类型.它有很大的局限性可能会让你感到困惑.批处理文件工作得非常好,或者自定义MSBUILD任务可以调用CabWiz
了解你的C++和P/Invoke技巧.你会需要它们.在没有P/Invoking的情况下编写有用的CF应用程序几乎是不可能的.
编码为目标的最小公分母.
部分类是你的朋友,特别是在目标类型(PPC,电话,非移动CE)之间划分逻辑.
避免从持久存储中运行应用程序,尤其是对于CE和WInMo之前的应用程序5.复制到RAM并从那里运行以防止请求分页导致您死亡,尤其是在睡眠/唤醒周期之后.
应用程序不应该关心睡眠/唤醒转换,但那是纯粹的理论.睡眠唤醒**将*改变您的应用行为,所以再次测试,测试,测试.
我提过测试吗?特别是在每个设备上你都可以得到你的手吗?从您的测试实验室购买eBay的廉价硬件.除非您打算使用较新设备的特定功能,否则拥有更多设备比拥有最新设备更重要.
如果您打算以编程方式使用蓝牙,请求神圣干预.熟悉Widcomm和Microsoft堆栈,并了解它们不一样.
观看Compact Framework中有关内存管理的MSDN网络广播.再次观看你第一次错过的东西.
注意睡眠/唤醒使内部句柄无效并导致访问冲突.这更为深奥,但肯定会发生.例如,如果您正在从存储卡运行应用程序,则整个应用程序不会加载到RAM中.正在使用的片段被请求分页以供执行.这一切都很好.现在,如果关闭设备,驱动程序全部关闭.重新启动电源时,许多设备只需重新安装存储设备即可.当你的应用程序需要在更多程序中请求页面时,它不再是它的位置而且它会消失.安装的商店中的数据库可能会发生类似的行为 如果您有一个打开的数据库句柄,在睡眠/唤醒周期后,连接句柄可能不再有效.
安装Platform Builder的评估版.许多东西的源代码都在那里(比如网络用户界面,许多驱动程序等),当你的P/Invoke代码没有按照你的预期进行时,你至少可以找到一个去寻找的地方. "为什么".
添加5/25/10
不要指望WinMo下的电源管理API能够跨设备一致地或正确地(甚至根本不)工作.实际上,即使使用相同的硬件,它也可能从OS构建更改为OS构建.
添加7/27/10
如果您正在使用美学UI,请准备好进行大量自定义或手动绘图.
如果您正在进行自定义或手动绘图,并且需要使用透明度,请准备好迎接挫折,并且必须编写古怪的代码或直接调用本机代码来解决 CF中的缺点.
添加11/22/11
不要认为仅仅因为BCL中存在名称空间或类,它实际上是以任何有用的方式实现的. 证书当然不是.
我只是添加到列表中,因为它们发生在我身上......
OpenNETCF是一个很好的资源.
他们的智能设备框架是使用.NET Compact Framework进行开发时必不可少的,因为缺少许多完整框架功能[我认为有人曾经说过.NET Compact Framework是NotImplementedException的包装!]
这是不特定于只是 Compact Framework的设备,但它抚养它丑恶的头多了很多关于他们因资源约束上在移动平台上开发开发时.
最近我遇到了一个很棒的帖子,作为管理内存泄漏的一部分的一部分,这帮助我在我们的一个移动应用程序中设置DataGrid.DataSource时发现了一个我不知道的漏洞.
当绑定一个DataGrid,你应该不直接使用这样的:
dgDataGrid.DataSource = dsDataSet;
因为每次没有正确处理时,这会创建一个新的CurrencyManager.相反,您希望首先将DataGrid绑定到BindingSource,以避免资源泄漏.
bsData.DataSource = dsDataSet; dgDataGrid.DataSource = bsData;
谁知道?斯科特朗廷在另一篇文章中做过.谢谢斯科特!
如果您必须支持多种屏幕尺寸/分辨率,表单继承是一种很好的方法.基本上,您设计的表格适合标准的320x240屏幕.要支持不同的屏幕大小,您只需添加一个新表单,从您的自定义表单(而不仅仅是表单)继承,然后根据需要重新排列控件.
另一个有用的技巧是以一种允许您将父表单的标题暂时设置为""的方式包装ShowDialog调用 - 这样可以使应用程序中的所有打开表单不会显示在正在运行的程序列表中.增强包装器的另一种方法是使用父窗口的句柄PInvoke SetForegroundWindow.这可以确保父母在孩子关闭后总是重新出现; 没有这个调用,其他窗口可以插入父窗体上方的z-stack中.
注意SD卡上的加密.SqlCE将完全停止工作.Oracle Lite在加密下的行为更加险恶,因为它的部分功能和部分功能都不起作用.
避免使用SqlCE RDA并合并复制.如果它们可靠地工作,这些将是很棒的工具,但是在复制期间可能意外地丢弃网络连接的情况下(在WM世界中很常见).这一点我很难与生产应用程序.我们处理的MS支持技术最终被迫承认它不能100%工作.实际报价:"只是继续尝试复制 - 他们最终会正确合并".
大多数不同寻常的东西需要通过P/Invoke直接调用Windows API.我发现http://www.pinvoke.net/是Win32和Windows CE上P/Invoke的优秀资源.
正如一个供参考,如果你心烦没有在Visual Studio 2010 Compact Framework的支持,然后去这里投票支持它在被加入.(传播消息)
MS在Connect中或多或少地放弃了现有的功能请求.请转到新的用户语音网站以投票支持此功能.