.NET 7 AOT 的使用以及 .NET 與 Go 互相調用( 三 )


需要注意的是,裁剪是沒有那么簡單的,里面配置繁多 , 有一些選項不能同時使用,每個選項又能帶來什么樣的效果,這些選項可能會讓開發者用得很迷茫 。
經過筆者的大量測試,筆者選用了以下一些配置,能夠達到很好的裁剪效果 , 供讀者測試 。
首先,引入一個庫:
<ItemGroup><PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-*" /> </ItemGroup>接著,在項目文件中加入以下選項:
<!--AOT 相關--><PublishAot>true</PublishAot><TrimMode>full</TrimMode><RunAOTCompilation>True</RunAOTCompilation><PublishTrimmed>true</PublishTrimmed><TrimmerRemoveSymbols>true</TrimmerRemoveSymbols><PublishReadyToRunEmitSymbols>false</PublishReadyToRunEmitSymbols><DebuggerSupport>false</DebuggerSupport><EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding><InvariantGlobalization>true</InvariantGlobalization><HttpActivityPropagationSupport>false</HttpActivityPropagationSupport><MetadataUpdaterSupport>true</MetadataUpdaterSupport><UseSystemResourceKeys>true</UseSystemResourceKeys><IlcDisableReflection >true</IlcDisableReflection>最后,發布項目 。
吃驚!生成的可執行文件只有 1MB 了,而且還可以正常執行 。

.NET 7 AOT 的使用以及 .NET 與 Go 互相調用

文章插圖
筆者注:雖然現在看起來 AOT 的文件很小了,但是如果使用到 HttpClient、System.Text.Json 等庫 , 哪怕只用到了一兩個函數,最終包含這些庫以及這些庫使用到的依賴,生成的 AOT 文件會大得驚人 。
所以 , 如果項目中使用到其他 nuget 包的時候,別想著生成的 AOT 能小多少!
C# 導出函數這一步可以從時總的博客中學習更多:https://www.cnblogs.com/InCerry/p/CSharp-Dll-Export.html
PS:時總真的太強了 。
.NET 7 AOT 的使用以及 .NET 與 Go 互相調用

文章插圖
在 C 語言中,導出一個函數的格式可以這樣:
// MyCFuncs.h#ifdef __cplusplusextern "C" {// only need to export C interface if// used by C++ source code#endif__declspec( dllimport ) void MyCFunc();__declspec( dllimport ) void AnotherCFunc();#ifdef __cplusplus}#endif當代碼編譯之后 , 我們就可以通過引用生成的庫文件,調用 MyCFuncAnotherCFunc 兩個方法 。
如果不導出的話,別的程序是無法調用庫文件里面的函數 。
因為 .NET 7 的 AOT 做了很多改進 , 因此,.NET 程序也可以導出函數了 。
新建一個項目 , 名字就叫 CsharpExport 吧 , 我們接下來就在這里項目中編寫我們的動態鏈接庫 。
添加一個 CsharpExport.cs 文件,內容如下:
using System.Runtime.InteropServices;namespace CsharpExport{public class Export{[UnmanagedCallersOnly(EntryPoint = "Add")]public static int Add(int a, int b){return a + b;}}}然后在 .csproj 文件中,加上 PublishAot 選項 。
.NET 7 AOT 的使用以及 .NET 與 Go 互相調用

文章插圖
然后通過以下命令發布項目,生成鏈接庫:
dotnet publish -p:NativeLib=Shared -r win-x64 -c Release
.NET 7 AOT 的使用以及 .NET 與 Go 互相調用

文章插圖
看起來還是比較大,為了繼續裁剪體積,我們可以在 CsharpExport.csproj 中加入以下配置,以便生成更小的可執行文件 。
<!--AOT 相關--><PublishAot>true</PublishAot><TrimMode>full</TrimMode><RunAOTCompilation>True</RunAOTCompilation><PublishTrimmed>true</PublishTrimmed><TrimmerRemoveSymbols>true</TrimmerRemoveSymbols><PublishReadyToRunEmitSymbols>false</PublishReadyToRunEmitSymbols><DebuggerSupport>false</DebuggerSupport><EnableUnsafeUTF7Encoding>true</EnableUnsafeUTF7Encoding><InvariantGlobalization>true</InvariantGlobalization><HttpActivityPropagationSupport>false</HttpActivityPropagationSupport><MetadataUpdaterSupport>true</MetadataUpdaterSupport><UseSystemResourceKeys>true</UseSystemResourceKeys><IlcDisableReflection >true</IlcDisableReflection>
.NET 7 AOT 的使用以及 .NET 與 Go 互相調用

文章插圖
C# 調用 C# 生成的 AOT在本小節中,將使用 CsharpAot 項目調用 CsharpExport 生成的動態鏈接庫 。

推薦閱讀