内容提要
本文介绍开源项目OpenClaw.NET,一个用.NET编写的自托管AI Agent运行时与网关,支持鉴权、策略、记忆、可观测性及多渠道接入,并编译为单文件原生二进制。文章以Rust概念类比,说明其异步、序列化、错误处理等设计,强调对Rust工程师的亲和力,并指导本地运行、创建工具、技能及插件,适合追求编译期纪律的开发者。
延伸解读
编译期纪律的跨语言映射
文章将 Rust 的编译期保证与 .NET 特性一一对应:NativeAOT 类比 cargo build --release,JSON 源生成器类比 serde 的 derive,可空引用类型与警告即错误类比 Option<T> 和 #![deny(warnings)]。这种映射帮助 Rust 工程师快速理解 .NET 的静态检查能力,但需注意 .NET 的源生成器需要显式登记类型,而非自动推导。
错误处理与内存管理的思维转变
Rust 依赖 Result<T, E> 强制处理错误,而 C# 使用异常,错误可跨层传播,由框架统一兜底。内存方面,C# 的 GC 消除了所有权和借用检查,但析构时机不保证,需用 IDisposable/using 管理资源。这种转变意味着失去部分显式性和确定性,但换来了业务代码编写时更少的编译器冲突。
AOT 裁剪对开发方式的约束
启用 TrimMode=link 后,裁剪器会删除未引用代码,因此 JSON 序列化必须使用源生成器,并显式声明 JsonSerializerContext。这要求开发者在新增 DTO 时手动登记,类似 Rust 中为 struct 添加 #[derive(Serialize)]。同时,AOT 与 JIT 两条运行时车道影响插件选择:原生动态插件仅支持 JIT,生产环境需用 TS 桥接插件。
Q&A
OpenClaw.NET 是什么?它和 Rust 生态中的哪些概念类似?
OpenClaw.NET 是一个用 .NET 编写的自托管 AI Agent 运行时与网关,集成了鉴权、策略、记忆、可观测性和多渠道接入,并可通过 NativeAOT 编译为单文件原生二进制。对 Rust 工程师而言,NativeAOT 类似于 cargo build --release 的产物,JSON 源生成器类似于 serde 的 derive,可空引用类型和警告即错误类似于 Option<T> 和 #![deny(warnings)]。
如何快速在本地运行 OpenClaw.NET?
需要 .NET 10 SDK(必须)、可选 Node.js 20+(仅用于 TS/JS 插件)和 LLM API Key。先运行 `dotnet run --project src/OpenClaw.Gateway -c Release -- --doctor` 校验配置,然后设置环境变量 MODEL_PROVIDER_KEY 和 OPENCLAW_WORKSPACE,最后运行 `dotnet run --project src/OpenClaw.Gateway -c Release`。默认监听 http://127.0.0.1:18789,浏览器打开 /chat 即可对话。
在 OpenClaw.NET 中如何创建一个自定义工具?
创建一个实现 ITool 接口的类,实现 Name、Description、ParameterSchema 属性和 ExecuteAsync 方法。例如,字符串反转工具 ReverseTextTool 实现 ITool,在 ExecuteAsync 中用 JsonDocument 解析参数并返回反转结果。然后将该工具添加到内置工具列表(如 CreateBuiltInTools 函数)中,重启网关即可使用。
OpenClaw.NET 中的技能(Skill)是什么?如何创建?
技能不是代码,而是一份给 Agent 的操作手册(Runbook),教 Agent 如何组合调用已有工具。创建只需一个文件夹和一个 SKILL.md 文件,零编译。SKILL.md 包含 YAML 前置元数据(name、description)和 Markdown 正文,描述任务步骤。系统采用渐进式披露:先只提供技能索引,Agent 判断相关时再拉取完整内容。
OpenClaw.NET 支持哪些插件类型?它们之间有何区别?
支持两种插件:原生 .NET 动态插件(进程内 DLL 加载,仅 jit 车道)和 JS/TS 桥接插件(Node.js 子进程 + JSON-RPC,两条车道都行)。原生插件类似 Rust 的 libloading,零开销但有 ABI 和生命周期风险;JS/TS 插件类似子进程 + IPC,有进程隔离和语言自由,但有一定 IPC 成本。生产环境(aot 车道)推荐使用 TS 桥接插件。
OpenClaw.NET 如何处理消息流转?
消息流转的核心是 OpenClaw.Gateway,它在启动时组合 Agent 运行时、消息管道、渠道适配器和插件宿主。一条用户消息从进入到回复共 11 步,涉及 IChannelAdapter、MessagePipeline、SemaphoreSlim、MafAgentRuntime.RunAsync 等组件。入站消息通过 webhook 进入,经校验解析后入队,出站按 ChannelId 路由投递。
OpenClaw.NET 的配置体系是怎样的?
配置体系类似 Rust 的 config crate,支持配置文件加环境变量覆盖。环境变量使用双下划线映射层级,例如 OpenClaw__Runtime__Mode 对应配置树 OpenClaw:Runtime:Mode。敏感字段支持 env:VAR_NAME 引用写法,生产环境推荐使用。
OpenClaw.NET 对 Rust 工程师有哪些亲和力?需要适应哪些差异?
亲和力体现在:非空默认、显式接口实现、编译期代码生成(JSON 源生成器)、确定性资源释放(IDisposable)、警告即错误、单文件原生二进制。需要适应的差异主要是错误处理从 Result 换成异常(显式性换简洁),以及内存从所有权换成 GC(确定性换省心)。