AOT介紹 .Net8的本地預編機器碼AOT,它幾乎進行了100%的自舉。微軟為了擺脫C++的鉗制,做了很多努力。也就是代碼幾乎是用C#重寫,包括了虛擬機,GC,記憶體模型等等。而需要C++做的,也就僅僅是引導程式,本篇通過代碼來看下這段至關重要的引導程式的運作模式。 支持功能 SqlSugar OR ...
AOT介紹
.Net8的本地預編機器碼AOT,它幾乎進行了100%的自舉。微軟為了擺脫C++的鉗制,做了很多努力。也就是代碼幾乎是用C#重寫,包括了虛擬機,GC,記憶體模型等等。而需要C++做的,也就僅僅是引導程式,本篇通過代碼來看下這段至關重要的引導程式的運作模式。
支持功能
SqlSugar ORM使用AOT
.NET AOT8 基本上能夠免強使用了, SqlSugar ORM也支持了CRUD 能在AOT下運行了
Nuget安裝
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配置教程
創建一個帶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要能發佈出去)
如何讓自已代碼支持AOT
1、不能有dynamic類型 可以用object替換
2、不能有emit可以用表達式樹代替換
3、一些反射找不到構造函數或者Type需要配置xml
4、反射不支持根據路徑載入程式集,可以從一個類的Type中拿出來
5、發佈出現c++錯誤,需在安裝和更新VS的地方把 c++桌面 裝上
6、發佈要選x64 不支持x86 和arm