码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 写给 C++ 工程师的 OpenClaw.NET 上手指南:用你熟悉的 C++ 思维,跑起一个生产级 AI Agent


    它像一个「基于 boost.asio + REST 端点的常驻服务」——对外是 HTTP / WebSocket / 各 IM 的 webhook,对内跑着一个能调工具、读写记忆、跨渠道对话的 AI Agent——只不过协程不用你手写 promise_type,内存不用你管 new/delete。
    合集 - AI开源项目(61)
    1.为 openclaw.net 集成 ElBruno.MempalaceNet 记忆系统05-032.Graphify-DotNet:AI 驱动的 .NET 代码知识图谱构建工具05-023.SonnetDB:.NET 生态下的高性能嵌入式时序数据库04-284.C# 原生编码智能体运行时 SharpClawCode04-275.SharpIDE: 基于 .NET 与 Godot 引擎的跨平台开源 IDE04-266.OpenClaw.NET .NET 原生插件开发完全指南:以 Mempalace 插件为范例05-057..NET生态系统中的A2A(Agent-to-Agent)协议支持与跨平台多智能体协同05-068.Memgraph 与 Neo4j 图数据库对比及 .NET 生态适配分析05-089.OpenClaw.NET 外部 CLI 连接器 (External CLI Connectors) 详细技术总结05-1010.OpenClaw.NET:给智能以形态05-1211.架构融合:Activity Host 作为确定性编排与认知智能代理的桥梁05-1812.OpenClaw.NET 兼容性目录指南(Compatibility Catalog)05-2113.当 AgentGateway 遇上 OpenClaw.NET:企业级智能体基础设施的深度协同实战06-0614.OpenClaw.NET 上线 MetaSkills :软件工程第一性原理的工业级实践06-1715.OpenClaw.NET MetaSKILLs 系统深度解析:AI Agent 正在学会「自己给自己写技能」06-1816.OpenClaw.NET 重大更新:Goal 机制登场,让 AI Agent 不再"半途而废"06-1817.OpenClaw.NET 祭出 TokenJuice:Agent 时代的"Token 瘦身引擎",让 LLM 上下文不再膨胀06-1918.从 OpenClaw.NET 的 /loop 实现,看 Loop Engineering 如何从概念走向工程实践06-2019.将 Rust 绑定到 .NET 10:Oxigraph 的 FFI 桥接实践06-2820.Token IO 架构的设计游戏:大模型产品形态四年演进的本质06-2921.当 AI 不再只是"说话":OpenClaw.NET 率先原生支持 MCP Apps06-3022.你的 AI Agent 会在服务器上"修仙"——OpenClaw.NET 长持久会话技术解读07-0423.从 Bun 的 Rust 重写,看 C# 如何重建 AI 基础设施层07-1024.当 AI 对话里直接弹出业务界面:MCP Apps 正在改写 SaaS 的集成逻辑07-1225.MCP + A2A 融合:协议层已就绪,信任层才是硬仗07-2126.C# MCP SDK 2.0 即将发布:去会话化、去握手、去运维噩梦07-2427.数字员工的成本账:OpenClaw.NET 如何用工程化实现"成功任务的单位经济学"(下)07-2328.25家巨头联名的那封公开信,为什么数字员工架构师应该逐字读一遍07-2829.从 Harness 引擎到 MetaSkill DAG 的确定性架构07-3030.从DDD到Ontology:当数字员工不再认"限界上下文"这堵墙07-3131.把 284B 的 DeepSeek V4 Flash 装进纯 .NET:TensorSharp 用一天改写了 .NET 推理栈的位置08-0132.MCP 第五版 × OpenClaw.NET:从协议升级到生态编排08-0233.纯 C# 追平 llama.cpp?.NET 本地推理三国杀08-0334."从"前锋"到"中场":为什么 Agent 基础设施的建设者必须是系统思考者08-0435.修 Bug 的手艺与架构的艺术:从熵增到熵减08-0636.改变世界的17个方程,如何重塑 GoodCrew 的架构哲学08-0637.Agent 系统的不确定性治理:当软件工程遭遇"梯度下降"08-1138.WorkBuddy 专家团的下一步:用 MetaSkill 把「提示词约定」升级为「运行时硬约束」08-1039.JVMGuard 来了,.NET 开发者别慌:你的 dotnet-monitor 早就准备好了08-1440.两种 Harness 哲学:从 DeepSeek Harness 的"过度抽象"争议,看 OpenClaw.NET 的另一种答案08-1541.当"入门第一课"的作者开始 Vibe Coding:廖雪峰 2026 上半年 AI 编程实践深度探索08-1642.TensorSharp 最新进展研究报告:从 DeepSeek V4 Flash 到 GLM-5.2,以及等待中的 GLM-5.308-2043.AI 编程时代,.NET 的机会在哪里?08-2544.3 张卡到底能不能跑大模型推理?从 vLLM、llama.cpp 到 TensorSharp 的多卡真相08-2845.纯 .NET 手写 CUDA kernel,GLM-5.3-Flash decode 跑出 llama.cpp 的 2 倍08-2946.TensorSharp 3.3.0.0 发布,视频生成、DFlash2 投机解码、安全加固一起来了08-3147..NET 异常处理的"暗门":代码里写满 catch,你依然能抓住它——从一个 AI Agent 运行时的源码说起09-1148.MetaSkill 落地 .NET:当 Agent 从「调用工具」进化到「组织工具」09-0349.写给 Java 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Spring 思维,跑起一个生产级 AI Agent09-0650.写给 Golang 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Go 思维,跑起一个生产级 AI Agent09-0451.写给 Python 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Python 思维,跑起一个生产级 AI Agent09-0552.写给 TypeScript 工程师的 OpenClaw.NET 上手指南:用你熟悉的 TS 思维,跑起一个生产级 AI Agent09-0553.写给 Rust 工程师的 OpenClaw.NET 上手指南:用你熟悉的 Rust 思维,跑起一个生产级 AI Agent09-08
    54.写给 C++ 工程师的 OpenClaw.NET 上手指南:用你熟悉的 C++ 思维,跑起一个生产级 AI Agent09-10
    55.写给 PHP 工程师的 OpenClaw.NET 上手指南:用你熟悉的 PHP 思维,跑起一个生产级 AI Agent09-0956.RedNb.Nacos 2.0.0 正式发布:.NET 接入 Nacos 3.2.4,AI Registry 全能力落地09-1357.把 LLM 密钥从环境变量里解放出来:OpenClaw.NET 迎来 Vault/OpenBao 密钥后端09-1658.事件风暴遇上 MetaSkill:把企业「世界模型」变成可执行的 DAG09-2159.TensorSharp 支持 Jev 模式了:一次去噪,直接读出决策09-2360.定时任务还想上 Hangfire?这个被 AI Agent 项目看上的 TickerQ,把反射全干掉了09-2461.不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线09-25
    收起

    编译出单文件原生二进制、没有头文件、async 不用手写状态机、内存安全但不用和借用检查器格斗——一个 C++ 工程师视角下的 .NET AI Agent 运行时。
    1

    为什么写这篇

    如果你是 C++ 工程师,你的世界观大概是:产物必须是原生机器码、资源生命周期必须确定、抽象不该有隐藏开销。Agent 框架的主流世界是 Python / Node——解释执行、运行时依赖一堆、性能随运气——你大概率看不上。

    OpenClaw.NET 值得你多看一眼:一个用 .NET 写的自托管 AI Agent 运行时 + 网关,鉴权、策略、记忆、可观测性、多渠道接入全部内置,关键是能用 NativeAOT 编译成无依赖单文件原生二进制——启动即原生码,没有 JIT 预热,没有运行时安装。它已经开源,仓库在 github.com/clawdotnet/openclaw.net。

    用一句 C++ 话说:

    它像一个「基于 boost.asio + REST 端点的常驻服务」——对外是 HTTP / WebSocket / 各 IM 的 webhook,对内跑着一个能调工具、读写记忆、跨渠道对话的 AI Agent——只不过协程不用你手写 promise_type,内存不用你管 new/delete。

    本文全程用 C++ 概念做类比。读完你能:看懂系统组成和消息流转、在本地把它跑起来、并写出你的第一个工具 / 技能 / 插件 / 渠道。


    一、30 秒认识 OpenClaw.NET

    能力 说明
    网关 HTTP / WebSocket / 浏览器 UI(/chat)/ 各 IM webhook / OpenAI 兼容端点(/v1/*)/ MCP(/mcp)
    Agent 运行时 推理循环、工具执行、记忆、会话、技能、策略、审批、断路器
    渠道 WebSocket、TG、Slack、Discord、Teams、WhatsApp,以及飞书 / 钉钉 / 企业微信
    扩展点 工具(Tool)、技能(Skill)、插件(Plugin)、渠道(Channel)、LLM Provider
    客户端 浏览器 UI、CLI、Avalonia 桌面 App、Blazor WASM 运维面板、TUI

    项目已开源:https://github.com/clawdotnet/openclaw.net。仓库里解决方案叫 OpenClaw.Net.slnx,命名空间是 OpenClaw.*——和名字对得上,找代码不迷路。


    二、C++ → C# 心智模型速查

    这是全文最该先读的部分。看懂这张表,后面 90% 的代码你都能读:

    你在 C++ 里熟悉的 .NET 里的对应物
    编译出原生二进制 NativeAOT——同款产物;默认还有 JIT 模式
    CMake / Make + vcpkg / conan dotnet CLI + MSBuild(.csproj)+ NuGet
    头文件 + 声明/定义分离 没有头文件——一份代码,编译器自己处理
    模板(编译期展开) 泛型(运行时具体化)+ where T : ... 约束(≈ concepts 青春版)
    std::async / C++20 协程 co_await Task + async/await——语言内置,不用手写 promise_type
    std::stop_token(C++20) CancellationToken——就是同一个东西
    std::optional string? vs string——非空默认,可空显式标注
    struct / class(都在栈上或你管堆) struct = 值类型 / class = 堆上引用类型——这个区分 C# 保留了
    std::unique_ptr / shared_ptr 不需要——GC 接管,引用语义 ≈ 万物 shared_ptr
    RAII(析构函数确定性释放) IDisposable + using 关键差异,见下
    虚函数 / 抽象基类 interface + virtual/override(接口必须显式声明实现)
    异常 + RAII 回滚 异常 + try/catch/finally——模型几乎一样
    boost.asio 的 io_context async runtime 内置,无感
    未定义行为(UB) 内存安全——越界、悬垂引用编译期/运行期拦死
    Google Test / Catch2 + gmock xUnit v3 + NSubstitute
    #define / 预处理器 基本没有预处理宏(条件编译仅限少数场景)
    constexpr const / static readonly

    语法上最容易愣住的三个点

    // 1) 异步:≈ C++20 协程,但编译器把所有状态机细节都包了
    public async Task<string> RunAsync(Session session, string msg, CancellationToken ct)
    {
        var result = await _llm.CallAsync(msg, ct);   // ≈ co_await llm->Call(msg)
        return result.Text;
    }
    // CancellationToken ≈ std::stop_token:协作式取消,显式传参,务必往下传。
    
    // 2) record + required:≈ 聚合初始化 + 编译期必填,带值相等语义(≈ 默认生成了 operator==)
    public sealed record OutboundMessage
    {
        public required string ChannelId { get; init; }   // 不给就编译不过
        public required string RecipientId { get; init; }
    }
    
    // 3) 可空引用类型:string? 可空,string 不可空——≈ std::optional vs std::string
    string? maybe = GetOrNull();
    string sure = maybe;                // ⚠ 编译警告——本项目警告即错误(≈ -Werror)
    string sure2 = maybe ?? "default";  // ?? ≈ maybe.value_or("default")
    

    最大的思维转换:RAII → GC + using

    这是 C++ 工程师最需要重建的习惯。C# 是 GC 语言:对象内存的回收时机不确定,析构函数(终结器)什么时候跑、跑不跑都不保证——RAII 里「离开作用域即释放」的直觉在这里对内存不成立。

    但对非内存资源(文件句柄、socket、锁),C# 给了显式机制:

    using var doc = JsonDocument.Parse(json);   // ≈ 栈对象,离开作用域确定性 Dispose
    // 异步版本:await using var stream = ...;  ≈ co_await 风格的确定性清理
    

    心智模型这样切换:内存交给 GC(你不用管),资源交给 using(你必须管)。看到实现了 IDisposable 的类型,就像看到管理着 fd/handle 的 RAII 类——必须包 using。

    性能纪律还在,只是换了位置

    GC 不等于放弃性能意识。本项目的写法你会眼熟:ValueTask(避免堆分配的轻量 future)、Span(≈ std::string_view,零拷贝切片)、ArrayPool(≈ 自己维护 freelist)。热路径上的分配纪律依然靠人——只是编译器不逼你。

    NativeAOT 与裁剪:你的主场

    「禁运行时反射、序列化走编译期代码生成」——C++ 工程师表示:RTTI 我都经常关,这算什么约束。

    本项目开激进裁剪(TrimMode=link),裁剪器会删掉"看起来没人引用"的代码,所以 JSON 序列化用源生成器——为类型声明 JsonSerializerContext,编译期生成序列化代码:

    [JsonSerializable(typeof(ProblemDetails))]
    [JsonSerializable(typeof(OperatorAccountService.StoreState))]
    internal partial class GatewayJsonContext : JsonSerializerContext;
    

    这就是「编译期生成 vs 运行期内省」的老对立面,你一直站编译期这边。你新增 DTO 时,记得挂到某个 JsonSerializerContext 上。

    裁剪还引出贯穿全文的两条运行时车道:

    • aot 车道:裁剪安全、低内存、无动态加载——≈ 静态链接的 release 构建,生产 Docker 镜像走这条。
    • jit 车道:完整 .NET,JIT 编译 + 支持运行时加载 DLL 插件——开发期默认走这条,≈ 支持 dlopen 插件的调试构建。

    三、一条消息的一生

    这是理解整个系统的主线。中枢是 OpenClaw.Gateway——它在启动时把 Agent 运行时、消息管道、渠道适配器、插件宿主组合起来,统一路由所有流量。

    一条用户消息从进来到回复,共 11 步(C++ 类比已标注):

    1. 渠道收消息:IChannelAdapter 把入站消息写进 MessagePipeline——≈ 一个有界的生产者-消费者队列
    2. Worker 取消息:1~4 个 worker(上限 = CPU 核数)从队列读——≈ 你起 std::thread 池抢任务
    3. 会话加锁:拿该会话的 SemaphoreSlim(≈ std::counting_semaphore<1>),同一会话不并发跑两轮
    4. 过中间件:限流、token 预算,可短路拒绝——≈ 请求处理管线上的拦截器链
    5. 进 Agent 运行时:MafAgentRuntime.RunAsync(...)
    6. 准备上下文:载入/新建会话、裁剪历史、注入记忆召回
    7. ReAct 循环:调 LLM → 要工具就执行 → 结果回灌 → 再调 LLM……直到产出文本
    8. 工具执行:一条完整链路——预设过滤 → 治理策略 → Hook → 人工审批 → 执行 → 审计
    9. 韧性:LLM 调用自带指数退避重试、超时、断路器、降级模型级联
    10. 落库:会话写入 IMemoryStore(dev 默认 sqlite)
    11. 回复出站:按 ChannelId 找到渠道适配器投递

    整个系统的「骨架接口」都在 src/OpenClaw.Core/Abstractions/:ITool、IChannelAdapter、IAgentRuntime、IMemoryStore、IToolHook……看懂它们 = 看懂系统的全部可扩展面。扩展方式就是「实现接口(≈ 继承抽象基类、重写纯虚函数)+ 注册进 DI 容器(≈ 一个类型安全的工厂注册表)」。


    四、把它跑起来

    前置:.NET 10 SDK(必须,≈ 装一次编译器 toolchain)、可选 Node.js 20+(仅跑 TS/JS 插件时需要)、一个 LLM API Key。

    # 先校验配置(≈ 启动前自检)
    dotnet run --project src/OpenClaw.Gateway -c Release -- --doctor
    
    # 启动(≈ cmake --build --config Release && ./openclaw)
    dotnet run --project src/OpenClaw.Gateway -c Release
    

    默认监听 http://127.0.0.1:18789,浏览器打开 /chat 即可对话。

    最快的本地启动(三个环境变量 + 一条命令):

    export MODEL_PROVIDER_KEY="sk-..."          # 你的 LLM key
    export OPENCLAW_WORKSPACE="$PWD/workspace"  # 工作区根目录
    mkdir -p "$OPENCLAW_WORKSPACE"
    dotnet run --project src/OpenClaw.Gateway -c Release
    

    配置体系是「配置文件 + 环境变量覆盖」的分层套路:环境变量用双下划线映射层级,OpenClaw__Runtime__Mode ↔ 配置树 OpenClaw:Runtime:Mode。敏感字段支持 env:VAR_NAME 引用写法,生产环境推荐——不用自己写 getenv 解析层。

    本地避坑速查:

    • 必须 .NET 10,多 SDK 并存时用 global.json 钉版本(≈ toolchain file 指定编译器版本)
    • 出厂 appsettings.json 里的默认 AuthToken 和示例 API key 仅供本地回环,对外部署务必改成 env: 引用,别把真实密钥提交进仓库
    • 公网绑定会被安全硬化拦截(缺鉴权 token、危险工具、raw: 密钥都会拒绝启动)——这是有意设计

    五、动手扩展:四种方式,从轻到重

    ① 写一个工具(Tool)—— 最常用

    一个工具就是一个实现 ITool 的类。C++ 视角:就是继承抽象基类、重写纯虚函数——C# 接口同样需要显式声明实现:

    public interface ITool   // ≈ class ITool { 全是纯虚函数 };
    {
        string Name { get; }              // LLM 用它来调用
        string Description { get; }       // 决定 LLM 何时调用它
        string ParameterSchema { get; }   // 参数的 JSON Schema
        ValueTask<string> ExecuteAsync(string argumentsJson, CancellationToken ct);
    }
    

    最小可用示例(字符串反转工具):

    public sealed class ReverseTextTool : ITool   // ≈ class ReverseTextTool : public ITool
    {
        public string Name => "reverse_text";
        public string Description =>
            "Reverse the characters of the given text.";
    
        public string ParameterSchema => """
        {
          "type": "object",
          "properties": {
            "text": { "type": "string", "description": "Text to reverse" }
          },
          "required": ["text"]
        }
        """;
    
        public ValueTask<string> ExecuteAsync(string argumentsJson, CancellationToken ct)
        {
            // 用 JsonDocument 解析入参(AOT 安全)≈ 手写 JSON DOM 解析,不走反射
            using var doc = JsonDocument.Parse(argumentsJson);   // using ≈ RAII,确定性 Dispose
            var text = doc.RootElement.GetProperty("text").GetString() ?? "";
            return new ValueTask<string>(new string(text.Reverse().ToArray()));
        }
    }
    

    然后把它加进内置工具列表(CreateBuiltInTools(...),≈ 你在 main 里集中构造并 push_back 进 std::vector> 的那一段),重启网关,对它说「reverse the text hello」——工具调用会经过完整的审计/治理/审批链路。

    ② 写一个技能(Skill)—— 最轻,纯 Markdown

    技能不是代码,而是一份「给 Agent 的操作手册」:教 Agent 遇到某类任务怎么组合调用已有工具。

    机制是渐进式披露:系统提示里只放技能索引(省 token)→ Agent 判断相关时拉取完整正文 → 需要时再读附属文件。

    创建只需一个文件夹 + 一个 SKILL.md,零编译:

    ---
    name: pr-reviewer
    description: 当用户要求审查一个 Pull Request 或 diff 时使用。
    ---
    
    ## 步骤
    1. 用 `read_file` 或 `shell`(git diff)拿到改动
    2. 按正确性、边界、安全、可读性审查
    3. 输出分级意见:🔴 必须改 / 🟡 建议 / 🟢 可选
    

    重启(或开热加载)即生效。

    ③ 写一个插件(Plugin)—— 打包一组能力

    两条路:原生 .NET 动态插件(进程内 DLL 加载,仅 jit 车道)和 JS/TS 桥接插件(Node.js 子进程 + JSON-RPC,两条车道都行)。

    这个取舍你闭着眼都懂:≈ dlopen 加载 .so 进进程 vs 起子进程走 IPC。前者零调用开销但 ABI/生命周期/崩溃隔离全是坑、且只能在 jit 车道用;后者有 IPC 成本但进程隔离、语言自由、崩了不拖垮宿主。原生契约仅 45 行:

    public sealed class MyPlugin : INativeDynamicPlugin
    {
        public void Register(INativeDynamicPluginContext context)
        {
            context.RegisterTool(new ReverseTextTool());
            // 还能 RegisterChannel / RegisterHook / RegisterProvider ...
        }
    }
    

    生产环境(aot 车道)要跑自定义逻辑,走 TS 桥接插件。

    ④ 接一个渠道(Channel)—— 接你自己的 IM

    契约是 IChannelAdapter(收 + 发),入站走「webhook → handler 校验解析 → 管道入队」,出站按 ChannelId 路由投递。照抄 Twilio SMS 的实现(最简单的参照)即可,6 步:配置类 → 适配器 → webhook handler → DI 注册 → 挂适配器 → 映射端点。

    webhook handler 的核心形态:

    // 验签 → 解析 → 白名单 → 入队,和你写的任何 webhook endpoint 一个结构
    public async ValueTask<WebhookResult> HandleAsync(
        string bodyText, string? signature,
        Func<InboundMessage, CancellationToken, ValueTask> enqueue, CancellationToken ct)
    {
        if (_config.ValidateSignature && !IsValidSignature(bodyText, _secret, signature))
            return WebhookResult.Unauthorized();
        // ... 解析、白名单校验 ...
        await enqueue(new InboundMessage { ChannelId = "myim", SenderId = senderId, Text = text }, ct);
        return WebhookResult.Ok();
    }
    

    每个渠道都该有的安全面:签名校验(恒定时间比较,防时序侧信道)、发送者白名单、体积上限、去重窗口。

    选型一图流

    你的需求 用 要编译吗
    加一个 Agent 能调用的动作 工具 要
    教 Agent 某类任务的处理流程 技能 不要(纯 md)
    打包一组能力 / 复用 TS 生态 插件 原生要 / 桥不要
    接一个新的消息入口 渠道 要

    六、开发约定:三个必须知道的红线

    1. 警告即错误(TreatWarningsAsErrors=true)+ 可空性强制——≈ -Wall -Wextra -Werror 全开。第一次写会被编译器频繁拦,但它挡掉的就是你在 code review 里最不想看到的那类空指针路径。
    2. JSON 必须走源生成器——对你而言这叫「编译期代码生成」,老朋友了。
    3. 数据安全铁律:记忆/会话默认落 ./memory/,严禁用「清空整库 / DROP / 删目录」做测试隔离——只删自己创建的数据,或用独立的 throwaway 路径。

    测试栈是 xUnit v3 + NSubstitute(≈ Google Test + gmock):

    dotnet test                                                # 全部(≈ ctest)
    dotnet test --filter "FullyQualifiedName~ProcessToolTests" # 单类(≈ gtest_filter)
    

    写在最后

    对 C++ 工程师来说,这套系统的读感大概是「熟悉中带着一丝轻松」:单文件原生二进制、非空默认、显式接口实现、编译期代码生成、确定性的 using 资源管理、警告即错误——你在乎的工程纪律都在。

    真正要适应的只有两件事:内存从 RAII 换成 GC(确定性析构变成了 using 显式管理非内存资源),以及模板换成带约束的泛型(编译期元编程的火力弱了,但编译速度快得不像话)。你失去一部分对内存的绝对控制,换来的是没有 UB、没有头文件、async 不用手写状态机——值不值,写两个工具你自有判断。

    想继续深挖,最可靠的三个源码入口:

    1. src/OpenClaw.Gateway/Program.cs —— 启动主线(≈ 你的 main.cpp)
    2. src/OpenClaw.Agent/MafAgentRuntime.cs —— Agent 循环本体
    3. src/OpenClaw.Core/Abstractions/ —— 所有可扩展接口(≈ 项目里那堆抽象基类的头文件)

    本文所有代码与结论均对照开源仓库 clawdotnet/openclaw.net 当前源码(运行时 = MAF + jit)。如果你发现与代码不符——以代码为准,也欢迎提 PR。

    觉得有用,欢迎去 GitHub 点个 Star ⭐,也欢迎点赞 / 在看 / 转发给你的 C++ 朋友 👋

    欢迎大家扫描下面二维码成为我的客户,扶你上云

  • 相关阅读:
    Android widget 小部件使用指南强化版
    shell中 << EOF 和 EOF 使用
    Python入门|零基础教程
    SQL基础
    狗厂员工来面试本想难为一下,问他内存溢出,结果被虐得连console.log也不敢写了
    计算机视觉与模式识别实验1-1 图像的直方图平衡
    mysql 提示Index column size too large. The maximum column size is 767 bytes.
    网址打包微信小程序源码 wap转微信小程序 网站转小程序源码 网址转小程序开发
    Llama2-Chinese项目:3.1-全量参数微调
    Golang内存对齐
  • 原文地址:https://www.cnblogs.com/shanyou/p/22851086
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号