.NET 7 AOT 的使用以及 .NET 与 Go 互相调用( 三 )

定义引用库函数的入口:
public static partial class Native{/// <summary>/// 检索有关系统当前使用物理和虚拟内存的信息/// </summary>/// <param name="lpBuffer"></param>/// <returns></returns>[LibraryImport("Kernel32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static partial Boolean GlobalMemoryStatusEx(ref MemoryStatusExE lpBuffer);}然后调用 Kernel32.dll 中的函数:
public class Program{static void Main(){var result = GetValue();Console.WriteLine($"当前实际可用内存量:{result.ullAvailPhys / 1000 / 1000}MB");Console.ReadKey();}/// <exception cref="Win32Exception"></exception>public static MemoryStatusExE GetValue(){var memoryStatusEx = new MemoryStatusExE();// 重新初始化结构的大小memoryStatusEx.Refresh();// 刷新值if (!Native.GlobalMemoryStatusEx(ref memoryStatusEx)) throw new Win32Exception("无法获得内存信息");return memoryStatusEx;}}使用 AOT 发布项目 , 执行 CsharpAot.exe 文件 。

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

文章插图
减少体积在前面两个例子中可以看到 CsharpAot.exe 文件大约在 3MB 左右 , 但是这个文件还是太大了 , 那么我们如何进一步减少 AOT 文件的大小呢?
读者可以从这里了解如何裁剪程序:https://learn.microsoft.com/zh-cn/dotnet/core/deploying/trimming/trim-self-contained
需要注意的是 , 裁剪是没有那么简单的 , 里面配置繁多 , 有一些选项不能同时使用 , 每个选项又能带来什么样的效果 , 这些选项可能会让开发者用得很迷茫 。
经过笔者的大量测试 , 笔者选用了以下一些配置 , 能够达到很好的裁剪效果 , 供读者测试 。
首先 , 引入一个库:
<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 的文件很小了 , 但是如果使用到 HttpClientSystem.Text.Json 等库 , 哪怕只用到了一两个函数 , 最终包含这些库以及这些库使用到的依赖 , 生成的 AOT 文件会大得惊人 。
所以 , 如果项目中使用到其他 nuget 包的时候 , 别想着生成的 AOT 能小多少!
C# 导出函数这一步可以从时总的博客中学习更多:https://www.cnblogs.com/InCerry/p/CSharp-Dll-Export.html
PS:时总真的太强了 。
.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

经验总结扩展阅读