文章目录
-
- 前言
- 一、被Python霸凌的日子,该结束了
- 二、MCP是个啥?就当它是AI的"USB-C口"
- [三、环境准备:就装.NET 9,别的不要](#三、环境准备:就装.NET 9,别的不要)
- [四、实战第一弹:手写C# Runner,让AI能跑代码](# Runner,让AI能跑代码)
- 五、实战第二弹:接入OpenClaw,给Agent装上手脚
- [六、双剑合璧:用Semantic Kernel当大脑](#六、双剑合璧:用Semantic Kernel当大脑)
- 七、跑起来看看效果
- 八、这方案牛在哪?咱们聊聊现实
- 九、坑与避坑指南
- 十、结语:.NET开发者的AI春天
目前国内还是很缺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 install、conda 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();
}
七、跑起来看看效果
假设你已经:
- 把前面的C# Runner代码跑在后台(或者直接用
dotnet run启动) - OpenClaw在Docker里运行(
docker run -p 8080:8080那套) - 环境变量里设了
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)也覆盖这些库,出事有人背锅。
九、坑与避坑指南
写到这儿得泼点冷水,这技术毕竟刚出预览版,有些坑你得知道:
- MCP SDK版本乱跳 :现在还是
0.1.0-preview.6,API随时可能变。建议把版本号锁死在csproj里,别自动升级。 - OpenClaw的Windows支持 :官方镜像基于Linux,如果你要在纯Windows环境跑(不装Docker),得用社区版的
MyClaw.NET,那个是C#原生实现,但还在alpha阶段,生产环境慎用。 - 代码执行安全 :前面示例为了简单直接用了
dotnet run,生产环境建议用Roslyn编译API,加上沙箱(Sandbox)限制文件和网路访问,防止AI被prompt injection攻击后删你文件。 - 大模型选便宜的:这种工具调用场景不需要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的朋友,否则看看零散的博文就够了。
