動態代碼框架發布-CZGL.Roslyn


CZGL.Roslyn

開源項目位置:https://github.com/whuanle/CZGL.CodeAnalysis

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

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

動圖演示

這里使用 Blazor 測試演示,代碼可以在源碼的 examples/BlazorExample 中找到。

Blazor 運行 CZGL.Roslyn

Blazor 演示的是以命名空間為單位的編譯,你可以通過定制后台,實現只需要代碼塊即可運行,連函數頭都不需要。更多功能等你來挖掘!

豐富的文檔與示例

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

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

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

文檔說明

API 文檔

版本更新計划

  • [ ] 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 就是你最佳的選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM