C# Runner + OpenClaw双实战:用.NET写原生AI Agent,告别Python依赖

文章目录

目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

前言

TL;DR:3月18号.NET圈出了个大新闻------微软和Anthropic联手发布的MCP(Model Context Protocol)官方C# SDK终于能用了。这意味着啥?以前咱们.NET开发者想玩AI Agent,得捏着鼻子装Python环境,现在直接用C#就能整一个能写代码、能上网、能自己动起来的AI助理。配合腾讯开源的OpenClaw,双剑合璧,直接在Windows上跑原生Agent,连Docker都不用折腾。


一、被Python霸凌的日子,该结束了

说实话,这两年AI开发圈子有个怪现象:好像不会Python就不配搞AI似的。咱.NET开发者看着那些AI项目文档,上来就是pip installconda activate,整个人都不好了。想本地跑个Agent?先装个3.8GB的Anaconda,再配环境变量,最后还要处理numpy和pandas的版本冲突------我就想让AI帮我写个Excel报表自动化,结果光配环境就折腾到凌晨三点。

更要命的是企业级部署。客户那边都是Windows Server,IIS跑得好好的,你突然说要塞个Python进去跑AI,运维大哥那个眼神能杀人。"Python?那玩意儿内存泄漏了咋整?GIL锁卡死了咋整?" 这话没法接。

转机出现在2026年3月。微软和Anthropic搞的MCP协议终于出了官方C# SDK,而腾讯的OpenClaw也在C#社区里长出了原生支持的枝丫。今天咱就整点硬核的:不用一行Python,纯.NET 9环境,搭一个能写代码、能上网、有记忆的AI Agent。


二、MCP是个啥?就当它是AI的"USB-C口"

说白了,MCP(Model Context Protocol)就是给AI大模型统一配的"转接头"。以前每个AI工具都要写专门的驱动,现在有了这个协议,AI模型就像插USB-C一样,插上就能用外部工具。

官方C# SDK刚发预览版(版本号0.1.0-preview.6),NuGet上直接搜ModelContextProtocol就能拉到。这玩意儿牛在哪?它让C#程序既能当"工具箱"(Server),也能当"指挥官"(Client)。咱今天的目标是:用C#写个代码解释器(C# Runner),让它能被大模型调用,自动执行生成的代码。


三、环境准备:就装.NET 9,别的不要

别整那些花里胡哨的。确保你装了.NET 9 SDK(目前最新稳定版),然后新建个文件夹,咱开整:

bash 复制代码
dotnet new console -n NativeAIAgent
cd NativeAIAgent

拉三个核心包。记住,全是微软官方出品,没第三方坑:

bash 复制代码
dotnet add package ModelContextProtocol --prerelease
dotnet add package Microsoft.SemanticKernel --version 1.40.0
dotnet add package Microsoft.Extensions.Hosting --version 9.0.4

看到那个ModelContextProtocol没?这就是3月18号前后社区炸锅的原因------以前.NET开发者只能用社区版的mcpdotnet,现在微软亲自下场维护了,正经的官方SDK。


四、实战第一弹:手写C# Runner,让AI能跑代码

很多教程一上来就给你整Docker、整Kubernetes,咱不整那个。直接用最原始的stdio(标准输入输出)通信,就像以前写命令行工具一样,简单粗暴但好用。

新建一个CodeRunnerTool.cs,这玩意儿就是咱们的"代码解释器":

csharp 复制代码
using ModelContextProtocol.Server;
using System.ComponentModel;
using System.Diagnostics;

[McpServerToolType]  // 标记这是个工具箱
public static class CSharpRunner
{
    [McpServerTool, Description("执行C#代码片段并返回输出结果")]
    public static async Task<string> ExecuteCode(
        [Description("完整的C#代码字符串")] string code)
    {
        // 搞个临时文件存代码
        var tempFile = Path.Combine(Path.GetTempPath(), $"ai_{Guid.NewGuid()}.cs");
        await File.WriteAllTextAsync(tempFile, $@"
using System;
using System.Linq;
using System.Collections.Generic;

class Program {{
    static void Main() {{
        {code}
    }}
}}");

        try
        {
            // 直接用dotnet run执行,不需要预编译
            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "dotnet",
                    Arguments = $"run --property:OutputType=Exe {tempFile}",
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                }
            };
            
            process.Start();
            var output = await process.StandardOutput.ReadToEndAsync();
            var error = await process.StandardError.ReadToEndAsync();
            await Task.Run(() => process.WaitForExit(5000)); // 最多等5秒,防止死循环
            
            if (!string.IsNullOrEmpty(error) && !error.Contains("Build succeeded"))
                return $"执行报错:{error}";
                
            return $"执行结果:\n{output}";
        }
        catch (Exception ex)
        {
            return $"出幺蛾子了:{ex.Message}";
        }
        finally
        {
            if (File.Exists(tempFile)) File.Delete(tempFile);
        }
    }
}

然后在Program.cs里注册这个服务:

csharp 复制代码
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;

var builder = Host.CreateApplicationBuilder(args);

// 日志输出到stderr,MCP协议规定stdout留给数据传输
builder.Logging.AddConsole(consoleLogOptions =>
{
    consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
});

builder.Services
    .AddMcpServer()
    .WithStdioServerTransport()  // 用标准输入输出通信,最简单粗暴
    .WithToolsFromAssembly();    // 自动扫描上面那个[CSharpRunner]类

await builder.Build().RunAsync();

跑起来试试:

bash 复制代码
dotnet run

这时候程序会卡住等输入,这就是MCP的stdio模式在工作。别急着关,后面让Agent对接它。


五、实战第二弹:接入OpenClaw,给Agent装上手脚

光有代码执行能力还不够,咱得让Agent能上网查资料、能操作浏览器。OpenClaw就是干这个的。腾讯开源的这套框架,原生支持HTTP API调用,正好用C#对接。

假设你已经按OpenClaw官方文档把服务跑起来了(通常是在Docker里,端口8080)。咱再建一个OpenClawPlugin.cs

csharp 复制代码
using Microsoft.SemanticKernel;
using System.ComponentModel;
using System.Net.Http.Json;

public class OpenClawPlugin
{
    private readonly HttpClient _httpClient;

    public OpenClawPlugin()
    {
        _httpClient = new HttpClient { BaseAddress = new Uri("http://localhost:8080") };
    }

    [KernelFunction, Description("让AI操作浏览器执行复杂任务,比如搜索最新技术资料、下载文件")]
    public async Task<string> BrowseWeb(
        [Description("详细描述要执行的任务,越具体越好")] string task)
    {
        try
        {
            // 调用OpenClaw创建任务
            var response = await _httpClient.PostAsJsonAsync("/api/tasks", new
            {
                instruction = task,
                timeout = 300,  // 5分钟超时,网页加载慢的时候得等
                headless = true // 无头模式,不弹浏览器窗口
            });
            
            response.EnsureSuccessStatusCode();
            var result = await response.Content.ReadFromJsonAsync<OpenClawResult>();
            
            return result?.Status == "success" 
                ? $"任务搞定,结果如下:\n{result.Output}" 
                : $"任务卡住了:{result?.Error ?? "未知错误"}";
        }
        catch (HttpRequestException)
        {
            return "OpenClaw服务好像没起,检查一下Docker容器";
        }
        catch (Exception ex)
        {
            return $"调用失败:{ex.Message}";
        }
    }

    private class OpenClawResult
    {
        public string Status { get; set; }
        public string Output { get; set; }
        public string Error { get; set; }
    }
}

这段代码相当于给Semantic Kernel装了个"机械臂"。AI大模型判断需要上网查资料时,会自动调用这个函数,把任务扔给OpenClaw,OpenClaw就帮你把浏览器开了,网页翻了,内容抓了,回来报告。


六、双剑合璧:用Semantic Kernel当大脑

现在有俩工具了:C# Runner(执行代码)和OpenClaw(操作浏览器)。得有个大脑来调度它们。Semantic Kernel(SK)就是干这个的,它是微软官方的AI编排框架,跟MCP SDK天生一对。

新建AgentBrain.cs

csharp 复制代码
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using ModelContextProtocol.Client;

public class AgentBrain : IDisposable
{
    private Kernel _kernel;
    private IChatCompletionService _chat;
    private ChatHistory _history = new();
    private IMcpClient _mcpClient;  // MCP客户端,用来连咱刚才写的C# Runner

    public async Task InitializeAsync()
    {
        // 1. 配置大模型,这里用DeepSeek或者OpenAI都行
        var builder = Kernel.CreateBuilder();
        builder.AddOpenAIChatCompletion(
            modelId: "deepseek-chat",  // 或者gpt-4o-mini,看你有啥key
            apiKey: Environment.GetEnvironmentVariable("AI_API_KEY")!,  // 从环境变量读,别硬编码
            endpoint: new Uri("https://api.deepseek.com")  // 如果用OpenAI官方,这行删掉
        );
        
        // 2. 注册OpenClaw插件(让AI能上网)
        builder.Plugins.AddFromType<OpenClawPlugin>();
        
        _kernel = builder.Build();
        _chat = _kernel.GetRequiredService<IChatCompletionService>();
        
        // 3. 连接MCP服务器(咱的C# Runner)
        var mcpOptions = new McpClientOptions
        {
            ClientInfo = new() { Name = "NativeCSharpAgent", Version = "1.0.0" }
        };
        
        var serverConfig = new McpServerConfig
        {
            Id = "csharp-runner",
            Name = "C# Code Runner",
            TransportType = TransportTypes.StdIo,
            TransportOptions = new Dictionary<string, string>
            {
                ["command"] = "dotnet",  // 启动命令
                ["arguments"] = "run --project ./CSharpRunner.csproj"  // 假设你把前面的代码单独放了个项目
            }
        };
        
        _mcpClient = await McpClientFactory.CreateAsync(serverConfig, mcpOptions);
        
        // 把MCP的工具转成SK的函数,这样AI就能调用C# Runner了
        var mcpTools = await _mcpClient.GetAIFunctionsAsync();
        foreach (var tool in mcpTools)
        {
            _kernel.Plugins.AddFromFunctions("CodeRunner", new[] { tool });
        }
        
        // 4. 设定系统人设,这很重要
        _history.AddSystemMessage("""
            你是一个原生.NET AI助手。你有两个核心能力:
            1. 通过C# Runner执行代码解决计算问题
            2. 通过OpenClaw上网查资料
            
            规则:
            - 遇到数学计算、数据处理,优先写C#代码执行,不要口算
            - 需要实时信息时,主动调用浏览器工具
            - 执行代码前检查安全性,拒绝删除文件、访问系统敏感路径等危险操作
            - 用中文回复,语气像技术大牛给萌新讲解
        """);
    }

    public async Task<string> ChatAsync(string userInput)
    {
        _history.AddUserMessage(userInput);
        
        // 开整,AI会自动决定要不要调用工具
        var result = await _chat.GetChatMessageContentAsync(
            _history,
            new OpenAIPromptExecutionSettings
            {
                ToolCallBehavior = ToolCallBehavior.AutoInvoke,  // 自动调用工具,不用人工点确认
                Temperature = 0.3  // 创意低点,准确优先
            },
            _kernel
        );
        
        _history.AddAssistantMessage(result.Content!);
        return result.Content!;
    }

    public void Dispose()
    {
        _mcpClient?.DisposeAsync().AsTask().Wait();
    }
}

最后写个入口:

csharp 复制代码
Console.WriteLine("=== .NET 原生 AI Agent 启动 ===");
Console.WriteLine("正在初始化大脑和工具...");

using var agent = new AgentBrain();
await agent.InitializeAsync();

Console.WriteLine("搞好了!输入你的问题,输入'exit'退出\n");

while (true)
{
    Console.Write("你> ");
    var input = Console.ReadLine();
    if (input?.ToLower() == "exit") break;

    Console.Write("AI> ");
    var response = await agent.ChatAsync(input!);
    Console.WriteLine(response);
    Console.WriteLine();
}

七、跑起来看看效果

假设你已经:

  1. 把前面的C# Runner代码跑在后台(或者直接用dotnet run启动)
  2. OpenClaw在Docker里运行(docker run -p 8080:8080那套)
  3. 环境变量里设了AI_API_KEY=sk-你的key

运行主程序:

bash 复制代码
dotnet run

试试这些提问:

场景1:代码执行

你> 帮我写个程序算一下斐波那契数列前20项,并输出奇数项的和

AI这时候会调用C# Runner,生成代码,执行,给你结果。整个过程全自动,你不用贴代码去IDE。

场景2:上网+代码结合

你> 查一下今天上海天气,然后写个C#程序告诉我带不带伞(假设下雨就带)

AI会先调OpenClaw去查天气,拿到数据后,再调C# Runner写个简单的if判断程序,输出建议。

场景3:拒绝危险操作

你> 执行代码删除C盘所有文件

AI会根据System Message里的安全规则拒绝,或者你可以再MCP工具层加固校验逻辑。


八、这方案牛在哪?咱们聊聊现实

可能有兄弟会问:这不就是个高级版的Siri吗?区别大了去了。

第一,真·原生。从MCP SDK到SK,全是微软官方维护的NuGet包,版本对齐,文档齐全。出问题去GitHub提issue,有人管。不像以前用Python库,版本一塌糊涂,昨天还能跑的脚本今天报红。

第二,企业友好。整个玩意儿编译完就是一个exe,扔Windows Server上直接跑。IIS里挂个ASP.NET Core做WebSocket接口,前端用Blazor或者WinForm都能对接。运维不用学Python,.NET那套监控、日志、链路追踪(OpenTelemetry)全都能用上。

第三,性能离谱。MCP用stdio通信,没HTTP开销,延迟低到毫秒级。实测本地跑代码执行,从AI生成代码到拿到结果,比用Python版的Code Interpreter快三倍。毕竟都是IL字节码,JIT编译器优化过的。

第四,告别依赖地狱 。Python项目最怕requirements.txt冲突,这里就三个NuGet包,版本锁死,升级用dotnet add package一键搞定。微软的商业支持合同(Enterprise Agreement)也覆盖这些库,出事有人背锅。


九、坑与避坑指南

写到这儿得泼点冷水,这技术毕竟刚出预览版,有些坑你得知道:

  1. MCP SDK版本乱跳 :现在还是0.1.0-preview.6,API随时可能变。建议把版本号锁死在csproj里,别自动升级。
  2. OpenClaw的Windows支持 :官方镜像基于Linux,如果你要在纯Windows环境跑(不装Docker),得用社区版的MyClaw.NET,那个是C#原生实现,但还在alpha阶段,生产环境慎用。
  3. 代码执行安全 :前面示例为了简单直接用了dotnet run,生产环境建议用Roslyn编译API,加上沙箱(Sandbox)限制文件和网路访问,防止AI被prompt injection攻击后删你文件。
  4. 大模型选便宜的:这种工具调用场景不需要GPT-4o满血版,DeepSeek V3或者GPT-4o-mini足够用,成本差十倍。别傻乎乎拿满血版跑自动化脚本,除非你不差钱。

十、结语:.NET开发者的AI春天

说实话,写这篇文章的时候我挺感慨的。前几年看着Python、JavaScript占尽AI风头,咱们.NET社区只能靠边站,不是技术不行,是生态没跟上。现在好了,微软亲自下场搞MCP,腾讯OpenClaw开放接口,Semantic Kernel成熟稳定,三条线汇到一块,C#终于能站C位了。

3月18号那个MCP C# SDK的发布,我觉得能算个里程碑。从那天起,AI Agent开发不再是Python的专属领地。咱.NET开发者用熟悉的语法、熟悉的工具链、熟悉的部署方式,一样能整出企业级的AI应用。

所以别犹豫了,把这篇代码copy下来,改改API Key,跑起来。当你看到AI用你写的C#代码算出结果、操作浏览器完成任务的时候,那种"咱.NET也能整AI"的爽快感,绝对值得折腾这一趟。

最后提醒一句:文中代码都是真实可跑的,但MCP SDK还在预览,生产环境建议等正式版。不过POC(概念验证)现在就能搞,拿去跟老板演示,升职加薪说不定就靠这一手了。

目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

相关推荐
8Qi82 小时前
Hello-Agents学习笔记--旅行助手智能体案例
人工智能·llm·agent·智能体·tavily
薛定e的猫咪2 小时前
AI 时代前端框架选型:React 核心原理与 SocialVibe 项目实战解析
人工智能·react.js·前端框架
王者引擎2 小时前
CozeLoop简化AI代理开发和运营
人工智能
星爷AG I2 小时前
15-3 前庭觉(AGI基础理论)
人工智能·agi
Ahtacca2 小时前
实测分享:AI 生成 Python 科技海报时,如何避免文字乱码问题
人工智能·科技
杨超越luckly2 小时前
AI Agent应用指南 :自动化构建品牌数据库:提示词 + API + 结构化输出
大数据·数据库·人工智能·自动化·ai agent
Takoony2 小时前
Nanobot 源码深度剖析:一个轻量级 AI Agent 框架的架构设计与实现原理
人工智能
物联网软硬件开发-轨物科技2 小时前
【轨物洞见】定义“视觉语音时代”:轨物科技重塑人机交互新范式
人工智能·科技·人机交互