定义引用库函数的入口:
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
文件 。
文章插图
减少体积在前面两个例子中可以看到
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 了 , 而且还可以正常执行 。
文章插图
笔者注:虽然现在看起来 AOT 的文件很小了 , 但是如果使用到
HttpClient
、System.Text.Json
等库 , 哪怕只用到了一两个函数 , 最终包含这些库以及这些库使用到的依赖 , 生成的 AOT 文件会大得惊人 。所以 , 如果项目中使用到其他 nuget 包的时候 , 别想着生成的 AOT 能小多少!
C# 导出函数这一步可以从时总的博客中学习更多:https://www.cnblogs.com/InCerry/p/CSharp-Dll-Export.html
PS:时总真的太强了 。
经验总结扩展阅读
- 2023年9月10日是安装窗帘的黄道吉日吗 2023年9月10日安装窗帘好吗
- 我的Vue之旅 10 Gin重写后端、实现页面详情页 Mysql + Golang + Gin
- 螺蛳粉要泡多久
- 2023年9月10日是买房的黄道吉日吗 2023年9月10日适合买房吗
- 2023年9月10日旅游好不好 2023年9月10日旅游好吗
- 2023年9月10日游玩好不好 2023年9月10日游玩行吗
- 2023年9月10日适合踏青吗 2023年9月10日踏青好吗
- 燕麦怎么煮
- 2023年9月10日出差行吗 2023年9月10日出差好不好
- 2023年9月10日适合坐船吗 2023年9月10日是坐船的黄道吉日吗