科技 2026-08-10 ChenReal 40

使用PublishAotClang 交叉编译发布 .NET Native AOT 应用

前阵子,在公众号文章翻出个好东西,叫 PublishAotClang


使用PublishAotClang 交叉编译发布 .NET Native AOT 应用

前阵子,在公众号文章翻出个好东西,叫 PublishAotClang,据说可以解决.NET AOT 不支持跨操作系统的编译。我把它晾了好久,一直没时间研究,最近想搞个 arm 的小主机来玩,按理这东东能帮我省不少的事,于是今天就来一波探索。

现在按照微软官方的.NET Native Aot 的 编译环境,发布Windows 应用只能在 Windows 环境下构建编译;发布Linux 应用只能在 Linux 环境下构建编译;发布Mac 应用只能在 Mac环境下构建编译。当然,其中还有arm64 和 x64,这一类 CPU 架构的问题,加起来可能更加繁琐。

多年前我就吐槽过这一点,这对于想把应用发布到多平台的普通开发者来说很不方便呀。说到这里就要表扬一下golang,编译器做的真好,跨平台的障碍基本没有,就连怼天怼地怼空气的 Rust 也比不上它。

言归正传,怎么弄呢?

GitHub:https://github.com/xljiulang/PublishAotClang

不想看我废话的可以直接点上面链接,跳转到官方的 GitHub,去看原味的说明文档 。

PublishAotClang 是一个 NuGet 包,用 Zig 包装成 Clang 工具链环境,专门帮助你在 Windows 上把 .NET 项目 PublishAot 到多种 Linux RID。

它原理大概是这样的(上面那一段是我从网上抄的),不过我也懒得深究,反正能够解决我的问题,这才是关键中的关键。

Windows开发环境下实操

操作其实很简单,很直接。简单到我都想略过不写了。不过想想还是不能偷懒,万一哪天自己忘记了,还要回去查官网原味的文档,有点丢人了。

  • 首先,打开.csproj文件,追加一行配置,把 PublishAotClang 的 NuGet 引入,就完事了。
<PackageReference Include="PublishAotClang" Version="1.0.5" />

不明白?好吧,看我的完整示例:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net10.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <PublishAot>true</PublishAot>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="PublishAotClang" Version="1.0.5" />
    </ItemGroup>

</Project>

  • 然后,就开始愉快地跨平台编译吧!
 dotnet publish -r linux-arm64 -o pub/linux-arm64
 dotnet publish -r linux-x64 -o pub/linux-x64

首次的编译可能比较长,因为要下载一些依赖,比如 Zig 的运行时之类的。后面就跟平常差不多了,编译出来的二进制 size,也跟常规的没有什么太大变化。

  • 最后,验证一下编译产物在对应的系统平台能否跑得起来。结果还真能跑,完美!

后记

Wait!可能你跟我都同时想到一个问题: PublishAotClang 这么好的东西,只能用在 Windows 上吗?如果是的话,那就属于暴殄天物了。对于当代的开发者来说,95% 以上的编译构建都会放在 Linux 上。Windows 嘛,说实在的,确实没有那么方便!所以,有时间我的深入研究一下,看看Linux是否能 City。如果能成,对我来说这才能真正形成生产力!

各位,期待一下吧~

评论 (0)

发表评论

验证码
返回