移动条码设备用C++还是C#编程?

2023-11-24

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

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

Intermec 的开发人员库附带 .Net 和 C++ SDK。我以前的 Win CE 2003 经验是使用 C++(MFC GUI、套接字和串行通信)。我对 C# 和 WPF 很熟悉,如果需要的话可以学习其他 GUI 框架。这让我可以自由选择一种语言 - 有什么建议吗?

I am NOT寻找提倡 C++ 而不是 C# 作为一般语言的答案 - 我在这两种语言中的生产力相似,并且我有足够的经验能够创建复杂、健壮的 C++ 解决方案。

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


多年来我一直在用 C、C++ 和 C# 设计和开发 Windows Mobile 和 Windows CE 软件。此外,我一直在 Honeywell(以前称为手持产品,2007 年被 Honeywell 收购)从事此工作,在那里我从事设备的几乎所有方面的工作,从驱动程序和服务到业务线 GUI 和实用程序。

首先,我won't告诉你一种语言比另一种更好......我可能在每种语言上花费了 50/50 的时间,并且每个平台在移动开发中肯定都有自己的位置。

不过,我建议您远离任何运行 WinCE 4.2 等旧操作系统的设备,特别是如果您正在考虑 .NET 开发。这样做的原因是 4.2 最多只在 ROM 中嵌入了 .NET CF 1.0(操作系统 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)。

诚然,与 Windows Mobile 相比,WinCE 的 GUI 无疑为您提供了更加“Windows”的外观和感觉,因此这完全取决于您的编程偏好以及最终用户的需求。

关于吉安纳卡基斯的关于 SDK 只是一个事物层的评论,这是不正确的。如果您有合适的 SDK,您应该可以像在 C++ 中一样访问任何设备或驱动程序,但可以轻松使用 C#。例如,霍尼韦尔以 C++、VB 和 C# 形式为我们的所有设备提供了广泛的 SDK,并且 SDK 的 C# 部分实际上具有more功能优于 C++ 部分。你会never必须使用我们的 C# 代码执行 P/Invoke。

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

至于一种语言优于另一种语言……这实际上完全取决于您到底想做什么。

司机和服务cannot不能用 Native (Win32) C 或 C++ 以外的任何语言编写。所以.NET 不适合这样的事情。 在保持轻量级方面,C 和 C++ 绝对可以成为移动设备上的朋友,因为您不需要整个 .NET 框架来运行该添加。请记住,任何进程的最大内存为 32MB(不包括 DLL...那是另一讲),因此如果您的应用程序要处理a ton对于数据来说,C++ 可能是最佳选择。

然而,我发现 C 和 C++ 在移动系统上的主要缺点之一是制作 GUIway比 .NET 更难 实际上,我编写的大多数 C++ 应用程序都是完全无头的,根本没有 GUI....NET CFdoes not(还)有 WPF,并且一直使用 WinForms,但它确实很容易上手。在设计器中几乎可以进行拖放操作。还要记住,正如我之前提到的,WinCE 具有与 Windows Mobile 完全不同的 GUI 范例。然而,有时 Windows Mobile 方式还是不错的,因为它迫使您保持 GUI 简单明了。

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

在更现代的设备上,两者的执行速度通常没有什么不同。诚然,每种语言总会有一小部分比另一种更快,但 .NET 在这一点上已经足够成熟,速度并不是真正的问题。我编写了具有高度交互性、动画 GUI 的极快应用程序,这些应用程序在具有 128MB RAM 和 420MHz ARM CPU 的设备上运行良好。我什至写了一个我必须做的应用程序减速因为它通过 P/Invoke 调用本机 DLL,而 .NET 部分基本上变得“不耐烦”。

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

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

另外,请记住,您需要考虑的不仅仅是硬件供应商的 SDK。虽然您需要特定的 SDK,因为每个设备都不同(即我之前链接到的 SDKwill not在 Intermec 设备上工作)所​​有非硬件相关的操作系统内容几乎都是全面标准的,这就是 Microsoft 的 Windows Mobile 或 Windows CE SDK 的用武之地。他们的 C++ 支持非常好,但他们确实在推动现在所有的东西都是.NET,所以随着操作系统的更新,C++ SDK 的更新越来越少,多得多现在的功能依赖于使用 .NET 不是你couldn't用 C++ 来做,只是他们没有为你做很多工作did在 .NET SDK 中执行。

好吧……那很长,但我试图将我多年经验的精华部分转化为一件事。我希望这是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动条码设备用C++还是C#编程? 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • JBoss 文件打开过多错误

    就在上周 我在访问 JBoss v 4 2 2 Web 应用程序时遇到了问题 当我转到主页时 我收到 java lang NullPointerException 错误页面 查看 JBoss 日志输出后 似乎打开了太多文件 那么我该如何关闭
  • 读取 Unicode 文件 C++

    我有一个简单的问题要问 我有一个以 FFFE 开头的 UTF 16 文本文件要读取 有哪些C 工具可以处理这种文件 我只想阅读它 过滤一些行 然后显示结果 它看起来很简单 但我只有处理普通 ascci 文件的经验 而且我很着急 我正在使用
  • 同步单例的正确使用?

    所以我正在考虑建立一个业余爱好项目 这是一种临时性的事情 只是为了温习我的编程 设计 它基本上是一个多线程网络蜘蛛 更新相同的数据结构object gt int 因此 为此使用数据库绝对是大材小用 我唯一能想到的是用于包含我的数据结构的线程
  • mysql:使用SET还是很多列?

    我正在使用 PHP 和 MySQL 我有以下记录 具有各种分层 事件类型 的事件 事件可以有多个类别和子类别 但此类类别和子类别的数量是固定的 带时间戳 设置桌子的最佳方式是什么 我是否应该有一堆列 30 左右 其中包含表示是或否的枚举 指
  • 如何递归地查找模块中的所有模块和类?

    如果你有 module A class B end end 您可以通过 A constants 找到 B 和类似的类 但是 在 Ruby 1 9 3 中 如果 B 在另一个模块中 则无法获取 B 在 Ruby 1 8 7 中您可以 modu
  • UI布局初始化错误-center-pane元素不存在

    我正在使用具有 centerLayout westLayout northLayout 的布局结构 当我运行该文件时 出现以下错误 UI 布局初始化错误 中心窗格元素不存在 中心窗格是必需的元素 我的模板是
  • Flutter 问题:滚动时列表视图重建项目

    当我滚动到列表视图的底部时 底部的项目将被重建 同样 当我滚动到顶部时 我的第一个项目会被重建 第一个项目是一张带有可选筹码的卡片 当发生这种情况时 该筹码将被取消选择 入口 动画也会重播 我怎样才能阻止这个 这是基本代码 它使用 simp
  • 如何修复NoSuchMethodError?

    我使用 Scala 2 10 0RC1 和 sbt 0 12 1 是什么原因导致此运行时错误以及如何修复此错误 在 2 9 2 上运行良好 确切的错误消息是 java lang NoSuchMethodError scala Predef
  • 如何使用 ScalaMock 模拟按名称调用参数(如 getOrElse)?

    我希望能够模拟返回值getOrElse方法 以便它返回传递的内容orElseScalaMock 的按名称调用参数 trait ToBeMocked def getOrElse arg Int orElse gt String String
  • 向测试厨房添加属性

    我正在尝试覆盖中的属性java食谱与测试厨房 当我尝试跑步时kitchen converge default centos 64 出现严重的 YAML 错误 driver name vagrant customize memory 1024
  • Angular4x:带有过期参数的 ngx-cookie-service

    我正在使用 ngx cookie service 组件 但是一旦我关闭浏览器 cookie 就会消失 也许我必须设置过期参数 但我无法获取它 如下文档所述 set name string value string expires numbe
  • Scala 宏:“无法从具有未解析类型参数的类型 T 创建 TypeTag”

    我正在玩 Scala 新宏并发现了这个gist from akshaal 看起来我不太明白 鉴于以下特征 fieldsMacro 或多或少与 akshaal 示例中的相同 case class Field I lt AnyRef name
  • InternalError_:频谱扫描错误。 S3 到 Redshift 复制命令

    我正在尝试使用 COPY 命令将一些数据从 S3 存储桶复制到 redshift 表 文件的格式是 PARQUET 当我运行执行 COPY 命令查询时 出现 InternalError Spectrum Scan Error 这是我第一次尝
  • 自从我将 Firebase 应用程序升级到新控制台(仅限)后,Facebook 登录不再有效

    自从我升级了 Firebase 控制台 仅 sdk 尚未更新 以来 我有一个具有 Facebook 和电子邮件登录功能的工作应用程序 Firebase 3 0 之前的应用程序版本之前可以运行 但在控制台升级后 它不再能够使用 Faceboo
  • 在 MATLAB 中获取排列的映射

    假设我有两个数组 其中一个是另一个的排列 A 2 1 5 3 7 B 7 2 1 3 5 两个数组中都没有重复 如何获得两者之间的排列映射 E g A gt B应该 2 3 5 4 1 意思是 A 1 gt B 2 A 2 gt B 3 A
  • jQuery(事件):监视元素样式

    假设有这样的元素 div class watch me style display none Watch Me Please div 正如我们所看到的 上面的元素样式是display none 我怎样才能制作脚本来观看这个元素 当该元素样式
  • C++ 中的根基类

    NET 中的每个对象都 直接或间接 继承自公共根基 Object C 中有这样通用的对象根吗 我该如何通过any对象函数 public void DoSomeStuff object o 编辑 为了澄清 目的 在该函数中我想调用指向成员函数
  • 使用内联回调

    我是 Twisted 的新手 我正在尝试编写一个简单的资源 显示数据库中的名称列表 这是我的代码的一部分 code from my ContactResource class def render GET self request def
  • 无法安装适用于 Android Studio 的英特尔 HAXM。错误 x86 仿真当前需要硬件加速

    我刚刚安装安卓工作室没有任何问题 但是当我运行模拟器时 出现错误 无法在模拟器中启动 AVD 输出 仿真器仿真器 错误 x86 仿真当前需要硬件加速 请确保英特尔 HAXM 已正确安装并可用 CPU加速状态 HAX内核模块未安装 我发现了很
  • 移动条码设备用C++还是C#编程?

    我将使用移动条形码扫描仪开发一些应用程序 并且需要在 C 和 C 之间进行选择在扫描仪上打码 我正在考虑Intermec的CK31或类似的 wifi 扫描选择 可编程性和用户界面选项的组合 根据其规格表 它运行 Windows CE NET