到了这里,其实我们已经能够做到静态链接任何的第三方库了。如果是 Windows 的话到此为止,因为 NativeAOT 程序自身只依赖 ucrt,Windows API 自身就已经提供了全部的 API 支持;但如果是 Linux 的话则还差一点,因为依赖外部的 libicu 和 OpenSSL,这个时候就需要我们使用官方为我们提供的属性来切换到静态链接了。
对于 libicu 而言,这个库重要提供国际化支持,如果不需要的话可以直接设置 true 这样就会关闭这个支持。但如果你需要的话则可以选择把它静态链接了:
发现了么?我们用 C 编写的静态库被我们彻底静态链接进了 C# 程序中!如此一来,我们不需要配置任何的环境,也不需要保留任何的依赖项,更不需要安装任何的第三方库,只需要把我们构建出来的 Test 这个可实行程序拷贝到任何一台 x64 的 Linux 机器上,就能运行输出我们想要的效果。
试着运行一下:
[{"id":1,"title":"Walk the dog","dueBy":null,"isComplete":false},{"id":2,"title":"Do the dishes","dueBy":"2025-04-07","isComplete":false},{"id":3,"title":"Do the laundry","dueBy":"2025-04-08","isComplete":false},{"id":4,"title":"Clean the bathroom","dueBy":null,"isComplete":false},{"id":5,"title":"Clean the car","dueBy":"2025-04-09","isComplete":false}]
复制代码
完美!
结语
有了 NativeAOT 和 Direct P/Invoke,我们能够创建完全静态链接的 .NET NativeAOT 程序,从而允许我们把二进制直接分发到任意的 Linux 发行版上,无需配置环境或依赖项就能运行。如此一来,.NET 解锁了构建完全 distroless 的二进制的能力。
并且,这同样适用于 Avalonia 这类桌面应用程序!你只需要使用 Direct P/Invoke 和 NativeLibrary 把 libSkiaSharp 和 ANGLE 静态链接进去(libSkiaSharp 需要自己从源码构建匹配的版本,ANGLE 可以用 vcpkg 直接下载安装静态库),你用 NativeAOT 构建出来的 Avalonia app 将能够在随便一个兼容的硬件架构上跑的任意的 Linux 发行版上跑起来。