CPF 使用C#的Native AOT 發布程序


微軟已經將AOT的包移到Nuget了,之前是在實驗測試服務器上的。並且由之前的alpha版本改成了preview版本。

C#的開發效率,接近C++的運行效率,而且可以防止反編譯,可以支持大部分反射功能。還有幾個小問題,暫時不能支持x86,win7上運行aot的程序可能需要打補丁!

 

CPF里使用AOT需要將項目改成net5以上版本,因為net5之后才有COM的包裝器,如果你只是給自己的控制台程序AOT的話,可以用低版本的netcore(.NET 7 Preview 3 開始,NativeAOT 將只支持 .NET 6+)

使用方式很簡單,編輯csproj,加入下面一段代碼,另外CPF的包版本需要換成最新的

  <PropertyGroup>
    <IlcOptimizationPreference>Size</IlcOptimizationPreference>
    <IlcGenerateStackTraceData>false</IlcGenerateStackTraceData>
  </PropertyGroup>
  <ItemGroup>
    <RdXmlFile Include="rd.xml" />
    <PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-preview.2.22152.2" />
  </ItemGroup>

一般建議根據發布平台的注釋掉其他平台的適配器,以及刪除其他平台的引用,用來減少發布的程序大小。比如如果發布Windows上的,可以把Mac和Linux的注釋掉。

另外需要注意的是使用AOT方式發布的話,需要到對應系統上發布,比如發布Linux的程序,就需要到Linux上發布。不支持跨操作系統編譯。

 

項目里增加個rd.xml文件,你可以根據需要添加一些反射的元數據描述

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="CPF" Dynamic="Required All" >
      <Type Name="CPF.Animation.KeyFrame`1[[CPF.Drawing.Color,CPF]]" Dynamic="Required All" />
    </Assembly>
    <Assembly Name="CPF.Windows" Dynamic="Required All">
      <Type Name="CPF.Windows.OpenGL.WglCreateContextAttribsARBDelegate" MarshalDelegate="Required All" />
    </Assembly>
  </Application>
</Directives>

 

一般的,項目右鍵,選擇發布。 如果你喜歡用命令行也是可以的。

 

選擇文件夾

設置好發布路徑,完成。

 

需要注意的是Windows端暫時只能用x64的,x86的好像還不行。需要用Release方式,Debug模式效果不好。設置好了之后,直接點發布。

之后一般等待一兩分鍾就行,你可以看到輸出那邊的相關信息

 

發布成功之后的程序,雙擊啟動秒開,比非AOT發布的啟動速度快多了。主程序小於30M,另外依賴一個7M的skia的dll

 

 

 AOT后的程序也是可以調試的,帶上對應的pdb文件,然后采用附加進程的方式附加剛才啟動的程序,然后就可以進入斷點了

 

如果出現無法啟動程序的情況,你可以先把項目輸出類型改成控制台再AOT之后運行,這樣就可以看到相關異常信息。比如反射類型缺失什么的,你可以編輯rd.xml文檔

 

更加詳細說明可以看看微軟的文檔  https://github.com/dotnet/runtime/tree/main/src/coreclr/nativeaot/docs

 


免責聲明!

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



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