為大模型 MCP Code Interpreter 而生:C# Runner 開源發(fā)布
在7月初,我立下了一個(gè) Flag:要做一個(gè)專門為大語言模型(LLM)設(shè)計(jì)的 C# 運(yùn)行器 MCP (Model-Protocol-Context)。我的小小執(zhí)念,是希望 C# 能夠像 Python 一樣,成為大模型世界里的一等公民。
經(jīng)過一段時(shí)間的構(gòu)思、踩坑和開發(fā),今天,我非常高興地向大家宣布:這個(gè)項(xiàng)目—— C# Runner 已經(jīng)正式開源發(fā)布了!
這是一個(gè)高性能、高安全性的 C# 代碼在線執(zhí)行平臺(沙箱),專為大語言模型(LLM)的 Function Calling、在線代碼編輯器、動態(tài)腳本執(zhí)行等場景而設(shè)計(jì)。我的目標(biāo)很簡單:為 C# 在 AI 浪潮中爭得一席之地,使其成為像 Python 一樣被大模型輕松調(diào)度的“一等公民”。
這個(gè)項(xiàng)目的誕生,源于我此前對實(shí)現(xiàn)“毫秒級、高安全性”執(zhí)行 C# 代碼方案的大量研究和實(shí)驗(yàn)。現(xiàn)在,我將這些成果凝聚成了 C# Runner。
項(xiàng)目地址:https://github.com/sdcb/csharp-runner
緣起:一個(gè)毫秒級的夢想
一切始于一個(gè)簡單而又極具挑戰(zhàn)性的目標(biāo):
在「冷啟動」場景下,把一段未知、可能不可信的 C# 代碼編譯并執(zhí)行完畢的時(shí)間控制在 100ms 以內(nèi)(理想 < 20ms),同時(shí)保證絕對的安全、可伸縮和跨平臺。
現(xiàn)在大模型的 Function Calling 或 Code Interpreter 基本都是跑 Python,這讓我很不甘心。我希望構(gòu)建一個(gè)服務(wù),能讓 C# 代碼的執(zhí)行體驗(yàn)如絲般順滑,快到毫秒級別;同時(shí)它必須固若金湯,即使用戶提交了惡意代碼,也無法對服務(wù)器造成任何危害。
在很多現(xiàn)代應(yīng)用場景中,我們都渴望能動態(tài)地執(zhí)行用戶提供的 C# 代碼。然而,這面臨著兩大核心挑戰(zhàn):
- 性能:常規(guī)的
dotnet run方式涉及到 MSBuild、項(xiàng)目還原等重度操作,耗時(shí)通常在數(shù)百甚至上千毫秒,完全無法滿足交互式場景的性能要求。 - 安全:執(zhí)行一段未知的、可能不可信的代碼,無異于在服務(wù)器上“裸奔”。必須有萬無一失的沙箱機(jī)制來防止惡意代碼破壞系統(tǒng)、竊取數(shù)據(jù)或?yàn)E用資源。
C# Runner 正是為解決這一對核心矛盾而生。
效果演示
為了直觀展示 C# Runner 的性能,我將一個(gè)示例網(wǎng)站部署到了 Azure 上。并且為了增加挑戰(zhàn),我只選擇了一臺 1GB 內(nèi)存的、Azure 上最便宜的虛擬機(jī)。
演示地址:https://csharp.starworks.cc/
在這個(gè)網(wǎng)站上,你可以直接輸入 C# 代碼并執(zhí)行,體驗(yàn)毫秒級的響應(yīng)速度。無論是簡單的 Console.WriteLine,還是復(fù)雜的計(jì)算邏輯,都能在極短時(shí)間內(nèi)完成。
它默認(rèn)已經(jīng)寫了一段簡單的代碼,你可以去修改它,然后點(diǎn)擊 Run Code 按鈕,執(zhí)行結(jié)果會顯示在下方的 Output 區(qū)域:

如果你細(xì)心觀察,會發(fā)現(xiàn)這個(gè) Output 區(qū)域是實(shí)時(shí)更新的。這得益于 C# Runner 對流式輸出(Server-Sent Events, SSE)的支持,你可以實(shí)時(shí)看到代碼的 stdout、stderr 和最終結(jié)果。
這是目前這臺 Azure 虛擬機(jī)的 htop 負(fù)載情況,資源占用非常低:

C# Runner 是如何工作的?
為了同時(shí)實(shí)現(xiàn)極致的性能和強(qiáng)大的安全性,C# Runner 采用了基于 Docker 的 Host-Worker 架構(gòu)。
- Worker:每個(gè) Worker 都是一個(gè)獨(dú)立的、輕量級的 Docker 容器。它是一個(gè)已經(jīng)加載了 Roslyn Scripting 環(huán)境的 Web 服務(wù),負(fù)責(zé)實(shí)際編譯和執(zhí)行 C# 代碼。
- Host:Host 是整個(gè)系統(tǒng)的入口和“大腦”。它維護(hù)著一個(gè)由多個(gè) Worker 組成的“資源池”。這些 Worker 在系統(tǒng)啟動時(shí)就已經(jīng)提前創(chuàng)建并預(yù)熱,隨時(shí)可以接收任務(wù)。
當(dāng)一個(gè)代碼執(zhí)行請求到達(dá) Host 時(shí),Host 會通過負(fù)載均衡策略(如輪詢)選擇一個(gè)空閑的 Worker,并將代碼交給它執(zhí)行。這種“池化 + 預(yù)熱”的模式,完美規(guī)避了 Docker 冷啟動的性能開銷,使得終端用戶可以享受到毫秒級的響應(yīng)速度。
? 核心特性一覽
?? 安全為本 (Security First)
- 容器級隔離: 所有代碼均在獨(dú)立的 Docker Worker 容器中執(zhí)行,與主機(jī)環(huán)境徹底隔離。
- 資源精細(xì)控制: 可通過 Docker Compose 精確限制每個(gè) Worker 的 CPU、內(nèi)存、進(jìn)程數(shù)等資源,防止資源濫用。
- 執(zhí)行超時(shí): 每個(gè)任務(wù)都可以設(shè)置超時(shí)時(shí)間,防止惡意死循環(huán)代碼。
- 自動回收: 可配置 Worker 執(zhí)行 N 次任務(wù)后自動銷毀并由新的純凈實(shí)例取代,杜絕環(huán)境污染。
? 性能至上 (Performance is Key)
- Worker 預(yù)熱與池化: C# Runner 的“秘密武器”,將容器啟動和環(huán)境初始化的開銷提前,保證業(yè)務(wù)請求的高性能響應(yīng)。
- Roslyn Scripting API: 采用內(nèi)存中編譯執(zhí)行的方式,速度遠(yuǎn)超傳統(tǒng)
dotnet run。 - 負(fù)載均衡: Host 自動將請求分發(fā)到多個(gè) Worker,輕松實(shí)現(xiàn)水平擴(kuò)展。
?? 功能豐富 (Feature-Rich & Ready to Use)
- 雙協(xié)議支持: 同時(shí)提供 HTTP REST API 和 MCP (Model-Protocol-Context) 接口,無縫對接傳統(tǒng)應(yīng)用和 AI Agent。
- 流式輸出 (SSE): 實(shí)時(shí)返回代碼的
stdout、stderr和最終結(jié)果,交互體驗(yàn)流暢。 - 內(nèi)置 Web UI: 提供一個(gè)美觀、易用的代碼編輯器,支持語法高亮和
Ctrl+Enter快捷執(zhí)行,方便快速測試和演示。 - 一鍵部署: 提供完整的 Docker Compose 解決方案,一條命令即可啟動整個(gè)服務(wù)。
?? 60 秒快速部署
體驗(yàn) C# Runner 非常簡單,你只需要提前安裝好 Docker 和 Docker Compose。
1. 下載 docker-compose.yml 文件
curl -L https://raw.githubusercontent.com/sdcb/csharp-runner/refs/heads/master/docker-compose.yml -o docker-compose.yml
2. 一鍵啟動服務(wù)
docker compose up -d
該命令會默認(rèn)啟動 1 個(gè) Host 和 3 個(gè) Worker 實(shí)例。
3. 開始使用!
部署成功后,在瀏覽器中打開 http://localhost:5050,即可看到一個(gè)簡潔的代碼編輯界面,開始你的 C# 代碼執(zhí)行之旅!
?? 靈活配置與使用
你可以通過 docker-compose.yml 文件輕松調(diào)整 Worker 的數(shù)量、資源限制以及回收策略,以適應(yīng)不同的負(fù)載場景。
例如,將 replicas 修改為 10,即可輕松將后端處理能力擴(kuò)展到 10 個(gè) Worker 實(shí)例。
# docker-compose.yml
services:
# ... host service ...
worker:
# ...
deploy:
replicas: 10 # 將 Worker 實(shí)例擴(kuò)展到 10 個(gè)
resources:
limits:
cpus: '0.50'
memory: 256M
無論是通過其 HTTP API 集成到你的業(yè)務(wù)系統(tǒng),還是通過 MCP 端點(diǎn) empowering 你的 AI Agent,C# Runner 都提供了清晰、簡單的調(diào)用方式。更多細(xì)節(jié)請參考項(xiàng)目主頁的 API 文檔。
基于 MCP 協(xié)議調(diào)用
如果你需要 MCP 協(xié)議,并希望通過它來調(diào)用 C# Runner,可以使用以下代碼示例:
var clientTransport = new SseClientTransport(new SseClientTransportOptions()
{
Name = "MyServer",
Endpoint = new Uri("https://csharp.starworks.cc/mcp"),
});
var client = await McpClientFactory.CreateAsync(clientTransport);
// Execute a tool (this would normally be driven by LLM tool invocations).
(await client.CallToolAsync(
"run_code",
new Dictionary<string, object?>() { ["code"] = "Console.WriteLine(\"Hello World!\");" },
new ProgressReporter(),
cancellationToken: CancellationToken.None))
.StructuredContent.Dump();
public class ProgressReporter : IProgress<ProgressNotificationValue>
{
public void Report(ProgressNotificationValue value)
{
value.Dump();
}
}
輸出將是實(shí)時(shí)的流式結(jié)果:
{"kind":"stdout","stdOutput":"Hello World!\n"}
{
"kind": "end",
"stdOutput": "Hello World!\n",
"elapsed": 30
}
總結(jié)
C# Runner 為 .NET 生態(tài)提供了一個(gè)開箱即用、兼顧性能與安全的動態(tài)代碼執(zhí)行解決方案。我希望它能成為您在構(gòu)建下一代應(yīng)用,特別是與 AI 結(jié)合的應(yīng)用時(shí)的得力工具。
這個(gè)項(xiàng)目是我個(gè)人的一次探索,也必然有許多可以改進(jìn)的地方。歡迎大家試用、反饋,甚至參與貢獻(xiàn)!
- 為項(xiàng)目點(diǎn)亮 Star ?,這是對我最大的鼓勵(lì):https://github.com/sdcb/csharp-runner
- 提交你的想法和代碼:歡迎通過 Issue 和 Pull Request 參與項(xiàng)目。
- 加入 QQ 群討論:歡迎加入 .NET 騷操作 QQ 群:495782587,一起交流 .NET 和 AI 的有趣玩法!

浙公網(wǎng)安備 33010602011771號