跨平台调用系统命令:Dart FFI 的 gh_mirrors/samples4/samples system_command 示例详解 📅 2026/8/17 18:58:53 跨平台调用系统命令Dart FFI 的 gh_mirrors/samples4/samples system_command 示例详解【免费下载链接】samplesA collection of Dart code samples by Dart DevRel项目地址: https://gitcode.com/gh_mirrors/samples4/samples在 Dart 生态中借助 dart:ffi 实现跨平台调用系统命令一直是开发者关心的进阶话题。本文以 Dart DevRel 官方维护的 samples4/samples 示例集中的 system_command 项目为蓝本用最直白的方式讲清楚如何在 Linux、macOS、Windows 三大平台通过 Dart FFI 直接调用操作系统原生 API。这份示例代码量极小、零原生依赖非常适合新手作为Dart FFI 调用系统命令的入门起点。下面我们就从原理、三平台实现到运行步骤逐一拆解。什么是 Dart FFI为什么要用它调用系统命令FFIForeign Function Interface外部函数接口是 Dart 调用 C 语言接口的标准通道。当你需要打开默认浏览器、启动外部程序、访问底层系统资源时使用 Dart FFI 调用系统命令是最直接的方式不依赖任何第三方包、性能损耗低、代码可控性强。官方示例 system_command 正是为此而生其说明见 README.md。system_command 示例概览一份代码覆盖三大平台该示例的核心思路是同一个目标各平台调用各自最合适的原生库对照表如下平台动态库调用函数对应源码Linuxlibc.so.6system()linux.dartmacOSlibSystem.dylibsystem()macos.dartWindowsshell32.dllShellExecuteWwindows.dartWindows 进阶user32.dllMessageBoxWwin32ui.dart三份代码运行后的效果一致调用系统默认浏览器打开 Dart 官网直观验证跨平台调用系统命令是否成功。Linux 平台Dart FFI 调用 libc 的 system() 函数Linux 实现最简洁核心流程分四步打开动态库、查找函数、把命令字符串转成指针、调用并释放内存final dylib ffi.DynamicLibrary.open(libc.so.6); final systemP dylib.lookupFunctionSystemC, SystemDart(system); final cmdP command.toNativeUtf8(); int result systemP(cmdP); calloc.free(cmdP);这里有Dart FFI 调用系统命令的核心步骤C 侧的int system(const char *string)需要在 Dart 中声明SystemCC 签名与SystemDartDart 签名两个 typedef再交给lookupFunction完成绑定字符串通过toNativeUtf8()转为指针调用结束后务必用calloc.free()回收内存避免泄漏。macOS 平台与 Linux 几乎一致的调用姿势macos.dart 与 Linux 版逻辑完全相同只有两点差异一是动态库路径改为/usr/lib/libSystem.dylibmacOS 将 C 标准库整合进了 System 框架二是实际命令改用open启动浏览器而 Linux 使用xdg-open。可见掌握了 Linux 版macOS 版几乎可以照搬。Windows 平台用 ShellExecuteW 启动外部程序Windows 没有 POSIX 的system()语义因此示例改用 shell32.dll 中的 ShellExecuteW。新手需要注意三个关键差异字符串必须用toNativeUtf16()转成 UTF-16 指针调用时要额外传入窗口句柄与SW_SHOWNORMAL显示参数函数名末尾的W代表宽字符版本。运行后同样会在默认浏览器中打开 Dart 官网。进阶玩法用 user32.dll 弹出原生消息框如果你觉得打开浏览器还不够过瘾仓库里还有 win32ui.dart演示如何通过 user32.dll 的MessageBoxW弹出一个真正的 Windows 原生对话框。它还能组合MB_OK、MB_ICONINFORMATION等标志位控制按钮和图标是理解 Windows GUI 系统调用的绝佳练习素材。快速运行 system_command 示例的完整步骤三步即可跑通全流程获取示例代码git clone https://gitcode.com/gh_mirrors/samples4/samples安装依赖进入目录后执行cd ffi/system_command dart pub get按平台运行dart run linux.dartmacOS 运行macos.dartWindows 运行windows.dart依赖配置见 pubspec.yaml整个项目只需ffi一个包环境要求 Dart SDK ^3.5.0门槛非常低。总结Dart FFI 调用系统命令的五个固定步骤回顾三份平台代码可以提炼出通用的调用模板任何 C 函数都可套用打开动态库DynamicLibrary.open(libc.so.6)声明双 typedefC 签名 Dart 签名各一份绑定函数lookupFunctionC, Dart(函数名)转换字符串UTF-8 用toNativeUtf8()Windows 宽字符用toNativeUtf16()调用并释放执行完毕后用calloc.free()回收指针 ✅掌握这五步你就能在 Dart 中自由调用各种 C 库无论是系统命令还是自研原生库。想继续深入的话还可以横向对比同仓库的 hello_world、primitives、structs 等 FFI 系列示例循序渐进地成为跨平台开发高手 【免费下载链接】samplesA collection of Dart code samples by Dart DevRel项目地址: https://gitcode.com/gh_mirrors/samples4/samples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考