.Net8的本地預編機器碼AOT,它幾乎進行了100%的自舉。微軟為了擺脫C++的鉗制,做了很多努力。也就是程式碼幾乎是用C#重寫,包括了虛擬機器器,GC,記憶體模型等等。而需要C++做的,也就僅僅是載入程式,本篇通過程式碼來看下這段至關重要的載入程式的運作模式。
.NET AOT8 基本上能夠免強使用了, SqlSugar ORM也支援了CRUD 能在AOT下執行了
SqlSugarCore
StaticConfig.EnableAot = true;//啟用AOT 程式啟動執行一次就好了 //用SqlSugarClient每次都new,不要用單例模式 var db = new SqlSugarClient(new ConnectionConfig() { IsAutoCloseConnection = true, DbType = DbType.Sqlite, ConnectionString = "datasource=demo.db" }, it => { // Logging SQL statements and parameters before execution // 在執行前記錄 SQL 語句和引數 it.Aop.OnLogExecuting = (sql, para) => { Console.WriteLine(UtilMethods.GetNativeSql(sql, para)); }; }); return db; 已支援功能 //查詢 var list=db.Queryable<Student>().ToList(); var list2=db.Queryable<Student>().ToDataTable(); var list3= db.Queryable<Student>().Select(it=>new { id=it.Id }).ToList(); //插入 、刪除和更新只要是實體目前測試下來 都OK db.Insertable(new Student() { Id = 1, Name = "aa" }).ExecuteCommand(); db.Deleteable(new Student() { Id = 1, Name = "aa" }).ExecuteCommand(); db.Updateable(new Student() { Id = 1, Name = "aa" }).ExecuteCommand(); //寫sql也支援 db.Ado.GetDataTable(sql); db.Ado.ExecuteCommand(sql);
//部分庫建表不支援 //動態建類不支援
建立一個帶AOT的類專案
新建一個rd.xml
<Directives> <Application> <Assembly Name="SqlSugar" Dynamic="Required All"> </Assembly> </Application> </Directives>
改專案檔案
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <InvariantGlobalization>true</InvariantGlobalization> <PublishAot>true</PublishAot> <Platforms>AnyCPU;x64</Platforms> </PropertyGroup> <ItemGroup> <RdXmlFile Include="rd.xml" /> </ItemGroup>
RdXmlFile這個重點參照我們新建的rd.xml (這個xml要能釋出出去)
1、不能有dynamic型別 可以用object替換
2、不能有emit可以用表示式樹代替換
3、一些反射找不到建構函式或者Type需要設定xml
4、反射不支援根據路徑載入程式集,可以從一個類的Type中拿出來
5、釋出出現c++錯誤,需在安裝和更新VS的地方把 c++桌面 裝上