首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

打造輕量級 C# Shell — OrcShell (一):核心架構與指令分派機制

     編輯:關於.NET

一、程式核心架構

OrcShell 架構圖

Context 為控制中樞,持有四大核心組件:

  • TypeManager:管理命名空間與型別樹結構
    TypeDictionary(Root)
    |--TypeDictionary (Namespace)
    |   |--TypeDictionary
    |   |   |--Type
    |   |--Type
    |--TypeDictionary
    |   |--Type
    |--Type
    
  • AliasCmds:指令別名字典
  • Instances:用戶變數字典
  • CmdDispatcher:指令分派器

主迴圈與分派流程

while ((cmd = Console.ReadLine().Trim()) != "exit") {
    if (!String.IsNullOrEmpty(cmd)) cxt.Invoke(cmd);
    Console.Write(">> ");
}

Context.Invoke 轉交 CmdDispatcher.Dispatch():

  1. 解析指令名、標記、參數
  2. 內建指令直接處理:debug/undebug、cdc、lsc/dirc、my、alias
  3. 別名指令展開後遞歸調用 Context.Invoke
  4. 其餘視為 C# 代碼片段,交由 CscCmdHandler 編譯執行

五大指令處理器

處理器指令功能
CdClassCmdHandlercdc進出命名空間
ListClassCmdHandlerlsc, dirc列出命名空間/型別
ListInstanceCmdHandlermy列出環境變數
ListAliasCmdHandleralias列出指令別名
CscCmdHandler(其它)編譯執行 C# 代碼

分派器核心代碼

public void Dispatch() {
    var parts = InputCmdString.Split(SPLITS, StringSplitOptions.RemoveEmptyEntries);
    if (parts.Length == 0) return;
    string cmd = parts[0], mark = "";
    var args = new List();
    int idx = 1;
    if (parts.Length > 1 && parts[1].StartsWith("-")) { mark = parts[1]; idx++; }
    for (; idx < parts.Length; idx++) args.Add(parts[idx]);

    switch (cmd.ToLower()) {
        case "debug": Context.Debug = true; break;
        case "undebug": Context.Debug = false; break;
        case "cdc": new CdClassCmdHandler(Context, InputCmdString, mark, args).Run(); break;
        case "lsc": case "dirc": new ListClassCmdHandler(Context, InputCmdString, mark, args).Run(); break;
        case "my": new ListInstanceCmdHandler(Context, InputCmdString, mark, args).Run(); break;
        case "alias": new ListAliasCmdHandler(Context, InputCmdString, mark, args).Run(); break;
        default:
            string fullCmd = Context.GetFullCmd(cmd);
            if (fullCmd != null) { // 別名展開
                if (!string.IsNullOrEmpty(mark)) fullCmd += " " + mark;
                foreach (var a in args) fullCmd += " " + a;
                Context.Invoke(fullCmd);
            } else { // 代碼片段
                new CscCmdHandler(Context, InputCmdString).Run();
            }
            break;
    }
}

專案資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved