C ++或C#编程移动条码设备?

我将使用移动条形码扫描仪开发一些应用程序,需要在C ++和C#之间进行选择,以便在扫描仪上进行编码。

我正在考虑Intermec的CK31或类似的WiFi,扫描选择,可编程性和用户界面选项的组合。 它根据规格表运行Windows CE .NET 4.2。

Intermec的开发人员库附带.Net和C ++ SDK。 我以前的Win CE 2003经验是用C ++(MFC GUI,套接字和串行通信)。 我对使用WPF的C#很满意,如果必须的话可以学习其他GUI框架。 这让我有选择语言的自由 – 任何建议都是这样或那样的?

不是在寻找C ++而不是C#作为语言的答案 – 我的工作效率相似,而且我有足够的经验来创建复杂,强大的C ++解决方案。

我将欣赏的是战争故事或因素,我们的平台评估, 以及这些设备上的编程。 例如:C#apps与C ++应用程序的电池寿命,内存消耗或语言选择的其他环境影响。 如果要避免使用特定版本的.Net CE,那将是一个很好的提示。

我已经用C,C ++和C#设计和开发Windows Mobile和Windows CE软件已经有好几年了。 此外,我一直在为霍尼韦尔(以前的手持产品,2007年由霍尼韦尔购买)这样做,我从事过几乎所有设备的工作,从驱动程序和服务到业务线图GUI和实用程序。

首先,我不会告诉你一种语言比另一种语言更好……我可能每次花费50/50的时间分配,每个平台在移动开发中肯定都有自己的位置。

但是,我会建议您远离任何运行与WinCE 4.2一样旧的操作系统的设备,特别是如果您甚至考虑使用.NET开发。 这样做的原因是4.2最多只有.NET CF 1.0嵌入ROM(OS ROM映像的一部分),这意味着你需要一个~5MB的CAB文件来安装至少.NET CF 2.0是的,你可以用CF 1.0开发,但实际上,使用这样一个旧框架是不值得的。 如今,大多数WinCE 5.0设备都安装了ROM中的CF(Compact Framework)2.0,所以我至少会寻找它。

同样徒劳,您甚至可能要考虑使用Windows Mobile 6.0或6.1的设备,因为它们易于编程并且将始终预装CF 2.0。 如果您想知道为什么我没有提到CF 3.0或CF 3.5,那只是因为第一个与这些版本一起发布的移动平台将是Windows Mobile 6.5,尚未推出。 虽然你可以随时安装框架(~8MB CAB)。

当然,WinCE肯定会通过其Windows Mobile表亲为其GUI提供更多“Windows”外观和感觉,因此这完全取决于您的编程偏好以及您的最终用户想要和需要的内容。

关于kgiannakakis对SDK 的评论只是一个事物层,这是不正确的。 如果你有一个合适的SDK,你应该拥有与C ++相同但具有C#易用性的任何设备或驱动程序的所有相同访问权限。 例如,霍尼韦尔为C ++,VB和C#中的所有设备提供了广泛的SDK,而SDK的C#部分实际上具有比C ++部分更多的function。 您永远不必使用我们的C#代码进行P / Invoke。

如果你想看看我正在谈论的SDK,它可以在这里免费下载并有一些很好的例子。 恕我直言,实际上我认为提供的SDK在许多情况下比硬件更重要,因为大多数时候,设备的硬件几乎是相同的。 他们都有ARM CPU,WiFi,蓝牙,激光或基于图像的扫描仪等。虽然,我看了你发布的Intermec链接,看起来这个单位实际上没有内置的扫描仪…你使用的是外部扫描仪挂在设备上? 如果您需要,请查看霍尼韦尔产品。 我们的设备可能是业内最好的基于成像器的条形码扫描器,内置于我们所有的单元中。 我们有一个坚如磐石的SDK(我应该知道,我写了很多)。 SDK使.NET能够极其访问设备上的所有硬件。 好的……我现在就停止销售。

至于另一种语言……它实际上取决于你想要做什么。

驱动程序和服务不能用Native(Win32)C或C ++编写。 所以.NET就是出类拔萃的。 在保持轻量级方面,C和C ++绝对可以成为您在移动设备上的朋友,因为您不需要整个.NET框架来运行添加。 请记住,任何进程最多都有32MB的内存(不包括DLL ……这是另一个演讲)所以如果你的应用程序要处理大量数据,那么C ++可能就是你的选择。

然而,我在移动系统上发现C和C ++的一个主要缺点是,使GUI比使用.NET更难实际实际上,我编写的大多数C ++应用程序都是无头的,没有GUI所有… .NET CF 没有 WPF(尚未),并且坚持使用WinForms,但它很容易上手。 在设计师中几乎拖放。 并且还记得,就像我之前提到的那样,WinCE具有与Windows Mobile完全不同的GUI范例。 但是,有时Windows Mobile方式很好,因为它会强制您保持GUI的简单性和重点。

使用.NET时,内存消耗可能会更高,但并非总是如此。 首先,如果将具有您将要使用的CF版本的设备存储在ROM中,则意味着您通常不会在.NET应用程序上使用与等效C ++应用程序相比更多的内存。 在某些情况下,.NET甚至会使用更少的内存。 例如,.NET应用程序与使用MFC的C ++应用程序通常可以使用更少的内存,因为C ++应用程序必须加载MFC框架(因为它尚未由OS加载…)。 此外,由于C#是受管理的,因此通常会减少内存使用量,因为垃圾收集器释放了您可能忘记在C ++应用程序中执行的内存。

更现代的设备上的执行速度通常在两者之间没有差异。 当然,每种语言都会有一小部分,其中一种语言比另一种语言更快,但.NET在这一点上已经足够成熟,速度并不是真正的问题。 我已经使用高度交互式的动画GUI编写了极快的应用程序,这些GUI在具有128MB RAM和420MHz ARM CPU的设备上运行得很好。 我甚至编写了一个我不得不放慢速度的应用程序,因为它通过P / Invoke调用本机DLL,而.NET部分实际上变得“不耐烦”。

我从未见过一种语言与另一种语言的电池寿命问题。 但我从来没有专门测试它。

我真的认为,最终,它仍然归结为您选择的设备附带的SDK。 如果它的.NET支持很差,那么你会发现你自己做了很多额外的工作让一切工作,在这种情况下我会选择C ++。 但是如果它具有很好的.NET支持(就像我工作的那样),你会发现自己的工作量少得多,而且可能会更快地完成工作。

此外,请记住,您不仅要考虑硬件供应商的SDK。 虽然你需要特定的SDK,因为每个设备都不同(即我之前链接的SDK 不能在那个Intermec设备上运行)所有非硬件相关的操作系统内容都是相当标准的,这是Windows Mobile的地方或者来自Microsoft的Windows CE SDK。他们的C ++支持相当不错,但是他们现在真的推动.NET的所有工作,所以当对操作系统进行更新时,对C ++ SDK的更新更少, 现在更多的function依赖于使用.NET并不是说你无法在C ++中实现它,只是因为他们没有为他们做过很多工作,而是他们在.NET SDK中做了。

好的……那很长,但我试图将我多年经验中的细节转化为一件事。 我希望这是有道理的。

您的问题的答案与您的申请类型有关。 如果您的应用程序主要是与硬件进行通信,并且只需要一层薄薄的业务逻辑和用户界面,那么C ++将是更好的选择。 要与扫描仪交互,您需要与驱动程序通信。 使用C ++可以更好,更快地实现这一点。 .NET SDK实际上是使用大量P / Invoke的C ++代码包装器,这使代码执行速度更快。

如果另一方面您的应用程序需要重要的业务层和/或用户界面,那么.NET(特别是C#)是更好的选择。 在这种情况下,生产力的提高远远超过了C ++的性能提升。

另一个重要因素是应用程序将部署到的设备类型。 您是仅定位Windows Mobile设备吗? 那么.NET是一个安全的选择。 对于Windows CE设备,您需要调查是否预先安装了紧凑框架。 此外,某些Windows CE设备可能不支持所有.NET命名空间。

最后,我建议阅读Mobile Architecture Pocket Guide ,这是一份关于移动应用程序架构决策的最新文档。

首先,我强烈呼应Adam的建议,基于同样的原因,此时基于CE .NET 4.2运行任何东西。 在这一点上它是操作系统的一个古老版本,除非你免费获得终端,否则它是不值得的,如果你选择进行C#开发,那么运行.NET 2的CAB下载真的很痛苦。

我们为摩托罗拉(Symbol)和Intermec设备开发了许多应用程序。 它们的当前API集合可靠地运行,因此我更担心设备的适用性而不是特定的API。 它们还提供合理的示例程序,可以轻松地剪切和粘贴解决方案。

我注意到摩托罗拉和Intermec之间的另一个很大区别。 在我使用的Intermec设备上(在C#中),每个符号系统的解码器需要大约一秒钟才能加载。 如果您在应用程序启动时使用有限数量的符号系统并设置扫描程序,这通常不是什么大问题,但如果您更改应用程序中的解码器(符号系统),则可能会导致严重延迟。

我已经开发了大约15年。 大约5年的C ++和3年的C#(目前是我选择的语言)。 在C ++中,我总是使用stdlib,有时会提升。

因为我从c ++切换到c#,所以我的开发时间减少了三分之一。 这是因为有几件事(没有科学的,只是我的观点):

  1. .Net是一个更完整的框架,比stdlib和boost组合更容易使用。
  2. C#有一个更好的结构,更容易阅读其他代码和代码。
  3. 使用C ++进行unit testing时,.Net中的unit testing很少,特别是使用Resharper和xUnit(xUnit得到了干净的语法,resharper让你直接在dev studio中测试特定的测试方法)。

我主要是代码服务器,GUI编程应该更快。