1. 程式人生 > 實用技巧 >動態程式碼框架釋出-CZGL.Roslyn

動態程式碼框架釋出-CZGL.Roslyn

CZGL.Roslyn

開源專案位置:https://github.com/whuanle/CZGL.CodeAnalysis

基於 Roslyn 技術的 C# 動態程式碼構建器以及編譯器,開發者可以使用此庫動態構建 C# 程式碼,並且通過指定條件編譯程式碼。

  • 執行時動態構造程式碼;
  • 執行時為程式提供新的模組功能,拓展能力;
  • 設計函式平臺,以程式碼片段為單位執行;
  • 語法分析提示,編譯錯誤語法警告,精確到程式碼行;
  • 完善的程式碼標準,避免動態程式碼語法錯誤;
  • 簡潔、簡單的 API,完整的 Test 測試;
  • ... ...

動圖演示

這裡使用 Blazor 測試演示,程式碼可以在原始碼的 examples/BlazorExample

中找到。

Blazor 演示的是以名稱空間為單位的編譯,你可以通過定製後臺,實現只需要程式碼塊即可執行,連函式頭都不需要。更多功能等你來挖掘!

豐富的文件與示例

CZGL.Roslyn 擁有豐富的文件說明和 API 介面說明,讓你使用起來得心應手!

文件 URL:https://1586052146.gitbook.io/codeanalysis

API URL:https://czgl-roslyn.github.io/czgl-roslyn

版本更新計劃

  • [ ] 0.1.0 α版(正在開發中,當前版本)

    特性:一個具有完整功能的初級版本。

  • [ ] 0.2.0 β(beta)版

    特性:消除了嚴重的錯誤和缺陷,完成大量的單元測試等,對程式碼的可靠性有了極大的提升;能夠上線 Nuget 提供使用者試用;對使用者的需求進行收集,改程序序;

  • [ ] 0.3.0 γ版

該版本已經相當成熟了,根據使用者使用 β 版本後的建議和需求進行更新;開始關注效能,進行效能測試已經採取措施對效能進行改進。

可以做什麼

最大的特點就是動態程式碼構造以及動態編譯,因此我們可以分為兩部分討論。

動態程式碼生成

  • 資料庫表還原實體,自動生成類模型檔案;(EFCore 有這功能)

  • 公司內部定義工具集,通過確定的模板,一鍵生成程式碼!

  • 通過已確定的邏輯功能,快速生成程式碼匯出!

  • 編寫 AOP 框架,實現動態代理;

  • 程式碼語法檢查;

  • 生成計劃程式碼,後臺管理哪部分程式碼可執行;

  • 工作流程式通過程式碼生成一次性構建完畢,工作流程直接寫到程式集中,提高效能!

  • 快速從表格等各種資料來源,生成程式碼;

  • 自定義 UI 生成器,通過拖拉控制元件生成程式碼;

    ... ...

動態編譯

  • 自研雲函式平臺,使用者上傳程式碼即可直接執行;

  • 公司後臺計劃任務,以程式集為單位,自定義計劃執行程式集;

  • 編寫 AOP 框架,動態編譯程式集;

  • 單檔案(.cs)編譯,不需要 SDK、IDE!脫離開發環境編譯!

    ... ...

與 Natasha 的關係

Natsha 是一個非常優秀的動態程式碼框架,由大帥主導,形成了功能完整、效能強悍,並且相容 .NET FX 4.6~.NET Core ↑ ,通過了大量效能測試以及高效能程式碼優化。

可以以強到不得了來形容。倉庫地址:https://github.com/dotnetcore/Natasha

那為什麼 還要寫 CZGL.Rolysn 呢?

1,鍛鍊技術能力;

2,與 Natasha 不構成競品, CZGL.Roslyn 儘可能做的輕量,開發者可以考慮業務大小,大型場景使用 Natasha;快速建設使用 CZGL.Roslyn;Natasha 學習曲線比較大,CZGL.Roslyn 學習上手比較快。

3,Natasha 功能完整,依賴比較多;CZGL.Roslyn 功能儘可能足夠同時儲存少量的依賴,體積小;

4,CZGL.Roslyn 適合寫小工具,例如 dotnet-tool、資料庫還原實體、為 ML.NET 提供快速程式碼生成等,適合作為小部件為你的程式提供額外的功能;Natasha 適合作為獨立的一個產品去做,圍繞 Natasha 構建更多功能;

論效能,Natasha 優秀;論功能完整性,Natasha 一整套大保健服務... ...

CZGL.Roslyn 相比 Natasha ,大概就只有 “輕量” 這個特點了,簡直被秒殺。。。

我可以從這個框架學習到什麼

框架特點是簡單易用,你可以從中學習到大量的反射知識,以及 Roslyn 知識,甚至可能學習到 EMIT(後面我會使用這種技術優化效能)。

例如,如何通過取得特性中的屬性值?

[Display(Name = "_Id")]
public int Id {get;set;}

一個 Type ,如何確定他是類、結構體、委託?

如果你查閱資料會發現,Type.IsClass 可以識別出類、委託;

以下程式碼為什麼 JAVA 和 C# 執行結果不同?

public class A
{
    public void Test
    {
        Console.WriteLine("A");
    }
}
public class B:A
{
    // 隱藏父類 Test 函式
    public new void Test
    {
        Console.WriteLine("B");
    }
}

A a = new B();
a.Test();

目前 CZGL.Roslyn 處於初版,程式碼還處於非常簡單的狀態,邏輯也很簡單,因此,如果你有意學習 C# 中的反射、動態程式碼技術等,想了解原始碼在生成後如何通過反射獲得資訊、原始碼會被如何編譯等,CZGL.Roslyn 就是你最佳的選擇。