跨平台交叉编译 Native AOT
如何将.NET 应用程序发布到鸿蒙上,肯定是很多人感兴趣的话题,目前.NET完全具备可以在OpenHarmony系统上运行的能力,.NET 现在有很多选项CoreCLR、Mono和NativeAOT。由于OpenHarmony的沙箱环境的限制,NativeAOT是最佳选择。孙策同学经过几个月的探索,他2024年12月14日在上海举办的.NET Conf China 2024 大会上和大家分享他的探索经验和成果,OpenHarmony作为一个开源的操作系统,本身就具有强大的兼容性和扩展性。而Avalonia则是一个跨平台的UI框架,能够在不同的操作系统上提供一致的用户体验。将这两者结合起来,简直就是强强联手!今天这篇文章要告诉你的是孙策在这个探索过程中的一个跨平台交叉编译NativeAOT技术:使用 Zig 作为链接器和 sysroot,允许从 Windows 机器交叉编译到 Linux-x64、Linux-arm64、Linux-musl-x64 和 Linux-musl-arm64。
NativeAOT(Native Ahead-Of-Time Compilation)是一种将 .NET 程序编译成本地机器代码的技术,以提高应用程序的性能和启动速度。交叉编译是指在一个平台上为另一个平台生成代码的过程。例如,在 Windows 上为 Linux 生成可执行文件。
为了交叉编译,你需要为目标平台安装相应的工具链。例如,如果你想为 Linux 交叉编译,你需要在 Windows 上安装 Linux 的工具链(如 GCC、Make 等)。这通常可以通过安装 Windows Subsystem for Linux (WSL) 或使用其他工具如 MinGW 来实现。我们有了更好方法:这个项目的地址:https://github.com/CeSun/PublishAotCross。
使用步骤:
1、从zig官网:https://ziglang.org/download/下载并配置 Zig:将 zig-windows-x86_64-0.14.0-dev.2540+f857bf72e.zip 解压并添加到 PATH。
这里要注意的一点是整个压缩包的内容要完整,复制二进制文件,还要复制 lib 目录,不然就可能发生找不到zig.exe 的错误,具体参考https://christophvoigt.com/notes/unable-to-find-zig-installation-directory-filenotfound/。

2、从https://releases.llvm.org/ 下载 LLVM 并将 llvm-objcopy 添加到 PATH,最简单的就是把llvm-objcopy.exe 文件放到zig.exe 相同目录下。
3、在项目中添加 PublishAotCross 的引用,具体可参考:https://github.com/CeSun/OpenHarmony.Avalonia 。

做好了上面的准备,就可以使用VS 的发布功能,下面的配置是使用新的 RID 发布项目,例如发布linux-musl-arm64 :
dotnet publish -r linux-musl-arm64

跨平台交叉编译 Native AOT的更多相关文章
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- 【原+转】用CMake代替makefile进行跨平台交叉编译
在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: ./configu ...
- CodeTyphon跨平台交叉编译的配置
CodeTyphon和Lazarus的关系相当于就是ubuntu和linux的关系 不过CodeTyphon提供了很多一键配置即可使用的交叉编译配置,而Lazarus就比较麻烦了,我也没用Lazaru ...
- 用CMake代替makefile进行跨平台交叉编译
在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: 1 2 3 ./c ...
- CPF 使用C#的Native AOT 发布程序
微软已经将AOT的包移到Nuget了,之前是在实验测试服务器上的.并且由之前的alpha版本改成了preview版本. C#的开发效率,接近C++的运行效率,而且可以防止反编译,可以支持大部分反射功能 ...
- 跨平台编译Go程序(交叉编译)
作用:比如你手头只有Mac系统,而你的用户有Linux和Windows的,他们也想用,你可以通过交叉编译出Linux和Windows上的可执行文件给他们用 (1)首先进入go/src 源码所在目录,执 ...
- Golang 交叉编译
各平台的GOOS和GOARCH参考 OS ARCH OS version linux 386 / amd64 / arm >= Linux 2.6 darwin 386 / amd64 OS X ...
- beeshell —— 开源的 React Native 组件库
介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...
- React Native 在 Airbnb(译文)
在Android,iOS,Web和跨平台框架的横向对比中,React Native本身是一个相对较新且快速开发移动的平台.两年后,我们可以肯定地说React Native在很多方面都是革命性的.这是移 ...
- .Net 7 的AOT的程序比托管代码更容易破解?
楔子 .Net 7的一个重要功能是把托管的源码编译成Native Code,也就是二进制文件.此举看似增加了程序反编译难度,实际上是减少了程序的破解难度.本篇在不触及整个程序架构的前提下,以简单的例子 ...
随机推荐
- Android内存分析命令
一.内存指标 Item 全称 含义 等价 USS Unique Set Size 物理内存 进程独占的内存 PSS Proportional Set Size 物理内存 PSS= USS+ 按比例包含 ...
- 三维医学图像深度学习,数据增强方法(monai):RandHistogramShiftD, Flipd, Rotate90d
#coding:utf-8 import torch from monai.transforms import Compose, RandHistogramShiftD, Flipd, Rotate9 ...
- 使用 Debugger 断点 如果打开了断点调试 就会跳转空白页面
<!DOCTYPE html> <html> <header> <title>test</title> </header> &l ...
- markdown.css 设置文章的样式
返回的详情文章内容是标签加内容文字,使用 markdown,css 渲染样式 : .markdown-body .octicon { display: inline-block; fill: curr ...
- NJU ICS2024 PA 作业心得(一)
NJU ICS2024 PA 作业心得(一) 由于自己并不是NJU 2024的学生,因此"堂而皇之"的把这份心得发在了网上,并且只是仅供非以此课程作为自己当前学年保研课的同学参考. ...
- 云原生周刊:GitOps 的 4 条核心原则
日前在温哥华举行的 cdCON + GitOpsCon 上,分享内容以 GitOps 原则为特色: GitOps 是声明式的: GitOps 应用程序是版本化的和不可变的: 自动拉取 GitOps 应 ...
- 锁的分类和JUC
锁的分类 乐观锁.悲观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改.Java 中,synchroniz ...
- Nuxt.js 应用中的 builder:generateApp 事件钩子详解
title: Nuxt.js 应用中的 builder:generateApp 事件钩子详解 date: 2024/10/23 updated: 2024/10/23 author: cmdragon ...
- 新手入门Java自动化测试的利器:Selenium WebDriver
今天我们将深入探讨一款强大的Java自动化测试工具--Selenium WebDriver.在正式介绍Selenium WebDriver之前,让我们首先对Selenium本身进行简要概述,以便更好地 ...
- Pylon C++ Programmer's Guide
移步至Pylon C++ Programmer's Guide观看效果更佳 Getting Started pylon编程指南是一个关于如何使用Basler pylon C++ API进行编程的快速指 ...