想在瀏覽器裡直接編寫、編譯、執行 C# 代碼?本系列分享一個極簡線上 IDE 實作,解決兩大核心問題:
Console.Write*)並在網頁顯示。CSharpCodeProvider 動態編譯 → 記憶體組件 → 反射呼叫 Main。Console.Write* 重導向至自訂 Consoler 靜態類別,執行後收集輸出回傳前端。
using System;
using System.Collections.Generic;
namespace VSOnline.Framework
{
public class Consoler
{
public static Dictionary Outputs { get; private set; } = new Dictionary();
public List Output { get; private set; } = new List();
public void Write(object obj) => Output.Add(obj?.ToString() ?? "");
public void WriteLine(object obj) => Output.Add((obj?.ToString() ?? "") + "\n");
}
}
id(如 Session ID 或 GUID)。CodeRun.Run(code, id):Consoler.Outputs[id] = new Consoler() 建立輸出收集器。Console.Write/WriteLine → Consoler.Outputs["id"].Write/WriteLine。Consoler 實例。ReturnOutput(id) 取出字串列表、移除收集器、回傳前端。| 決策點 | 選擇 | 理由 |
|---|---|---|
| 編譯引擎 | CSharpCodeProvider (CodeDom) | .NET Framework 內建,無額外套件;後續可遷移 Roslyn |
| 輸出重導向 | 字串替換 | 最簡單原型;生產環境需語法樹轉換 |
| 隔離單位 | ID 區分並行請求 | 靜態字典鍵值隔離,無需 AppDomain |
| 組件載入 | GenerateInMemory = true | 避免磁碟 I/O,提升回應速度 |
極簡架構即可跑通「瀏覽器寫 C# → 後端編譯執行 → 回傳輸出」完整流程。後續文章將給出 CodeRun 完整實作與單元測試。