如何将.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的更多相关文章

  1. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  2. 【原+转】用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: ./configu ...

  3. CodeTyphon跨平台交叉编译的配置

    CodeTyphon和Lazarus的关系相当于就是ubuntu和linux的关系 不过CodeTyphon提供了很多一键配置即可使用的交叉编译配置,而Lazarus就比较麻烦了,我也没用Lazaru ...

  4. 用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: 1 2 3 ./c ...

  5. CPF 使用C#的Native AOT 发布程序

    微软已经将AOT的包移到Nuget了,之前是在实验测试服务器上的.并且由之前的alpha版本改成了preview版本. C#的开发效率,接近C++的运行效率,而且可以防止反编译,可以支持大部分反射功能 ...

  6. 跨平台编译Go程序(交叉编译)

    作用:比如你手头只有Mac系统,而你的用户有Linux和Windows的,他们也想用,你可以通过交叉编译出Linux和Windows上的可执行文件给他们用 (1)首先进入go/src 源码所在目录,执 ...

  7. Golang 交叉编译

    各平台的GOOS和GOARCH参考 OS ARCH OS version linux 386 / amd64 / arm >= Linux 2.6 darwin 386 / amd64 OS X ...

  8. beeshell —— 开源的 React Native 组件库

    介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...

  9. React Native 在 Airbnb(译文)

    在Android,iOS,Web和跨平台框架的横向对比中,React Native本身是一个相对较新且快速开发移动的平台.两年后,我们可以肯定地说React Native在很多方面都是革命性的.这是移 ...

  10. .Net 7 的AOT的程序比托管代码更容易破解?

    楔子 .Net 7的一个重要功能是把托管的源码编译成Native Code,也就是二进制文件.此举看似增加了程序反编译难度,实际上是减少了程序的破解难度.本篇在不触及整个程序架构的前提下,以简单的例子 ...

随机推荐

  1. 打开word报错“内存或磁盘空间不足,无法显示所请求的字体”

    起因: 有一个部门同学在打开服务器上的某个word文档时报错,但是打开本地word文档正常,经过网上查询资料后发现有可能是以下几种原因造成. 可能造成此报错的原因: 1. 文档被锁定 解决办法: 鼠标 ...

  2. 【USB3.0协议学习】Topic3·三种Reset Events分析

    USB3.0中的三种Reset Events 1. PowerOn Reset PowerOn Reset被用来代指上电复位,当一个device接入到root hub或者外置hub的时候,该devic ...

  3. 墨天轮最受DBA欢迎的数据库技术文档-故障处理案例篇

    在之前发布的<墨天轮最受欢迎的技术文档-容灾备份篇>中,大家说想看故障处理案例篇的内容,这不!编辑部快马加鞭给大家整理来了,希望能够帮助到大家. 数据库故障可能出现在内存.网络.CPU.硬 ...

  4. Android复习(四)权限—>请求应用权限

    每款 Android 应用都在访问受限的沙盒中运行.如果应用需要使用其自己的沙盒外的资源或信息,则必须请求相应权限. 要声明您的应用需要某项权限,您可以在应用清单中列出该权限,然后在运行时请求用户批准 ...

  5. 利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点

    作者:Rick Jenkins 可以很好地与 Kubernetes 集成,不管是控制器(controller)还是构建节点(agent),都能以 Pod 的形式运行在 Kubernetes 上. 熟悉 ...

  6. 枚举(C语言)

    1.枚举定义 枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读. 枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性. 定义一个枚 ...

  7. jQuery 杂项方法-grep()_20220114

    jQuery 杂项方法-grep() 实例: var targetEmpArr = $.grep(empArr, function(elem,index){ return elem.empCode = ...

  8. 关于 PyCharm 2024安装使用 (附加永久激活码、补丁)

    第一步:下载安装包 访问 IDEA 官网,下载安装包,下载链接如下 : https://www.jetbrains.com.cn/pycharm/ 第二步,安装完成之后,下载补丁 下载地址(里面包含激 ...

  9. Paypal绑定招商银行 —— Paypal绑定收款银行账户的注意事项

    地址: https://code.newban.cn/446.html

  10. 3.4 Linux文件(目录)命名规则

    介绍完 Linux 系统中目录结构之后,读者一定想知道如何为文件或目录命名. 我们知道,在 Linux 系统中,一切都是文件,既然是文件,就必须要有文件名.同其他系统相比,Linux 操作系统对文件或 ...