動態程式碼框架釋出-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 就是你最佳的選擇。