.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 的文件很小了,但是如果使用到 HttpClientSystem.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 生成的动态链接库 。

推荐阅读