在 ARM 平台上使用 .NET Core SDK

2018年5月更新:
.NET Core 2.1 已提供 ARM 架构的 SDK binary,可参考 Dockerfile 下载使用。
—-

最近用 ARM 开发板搭了一个 mini PC,想偶尔拿来做 .NET 开发,不过遗憾的是 .NET Core 目前并没有提供 ARM 版的 SDK。

微软的开发人员在 GitHub issue 里给出的理由是目前没有什么性能足够好的 ARM 设备可以支撑一般的开发,不过这个说法其实是站不住脚的。ARM 平台并不是只有树莓派这种廉价设备,如果把预算加到 $200 左右,再买一些 SSD 之类的配件,编译运行一般的 .NET 项目是完全足够了。如果 $200 的板子性能还不够用,就上 $500 的,例如 NVIDIA Jetson 系列的性能足够覆盖大部分 .NET Core 的开发。

不过如果你使用的是没有大核的 ARM 设备,比如绝大多数 $100 以下的开发板,那么不建议使用 SDK 来进行开发,因为启动速度会慢到让你跺脚。雪上加霜的是 .NET Core ARM 版的 crossgen 几乎没什么用,所以每一次启动都要 full JIT。即使是在 2.0 GHz 的 Cortex-A72 核心上,运行 dotnet –help 也需要超过1秒的时间。树莓派上可能要5秒。

除此之外 SDK 还有一个重要的功能就是运行测试(dotnet test),而这个跟性能并没有什么关系,但是对项目开发来讲是至关重要的。

考虑到 .NET Core SDK 完全使用 C# 编写,没有任何 native code,编译一个 ARM 版也不是什么难事。

Steps:

1. 安装 .NET Core(参考

需要注意的是目前 .NET Core 还没有发布 AArch64 的 runtime 包,虽然从源码编译已经有 AArch64 支持,但是这样很麻烦。为了尽可能简化开发,我们选择 ARMv7 版本的 .NET Core 2.0。

如果你用的是 AArch64 架构的 OS,那么除了基于 dpkg 的发行版之外,几乎没有别的选择。所有基于 rpm 的发行版目前基本都不支持 AArch64 架构安装32位 ARM 的包;Arch Linux ARM 也不支持。

2. 编译 .NET SDK

理论上纯 .NET 程序可以通用于不同架构,但是 .NET CLI 在 Build 过程中使用了 crossgen,直接从现有的 .NET Core SDK 中把文件 copy 出来是不能用的。因此需要自己编译,并且 patch 源码,去掉 crossgen 过程。

找一个能够通畅连接国际互联网,并且性能强劲的 x86_64 Linux 机器,运行

git clone https://github.com/dotnet/cli
cd cli
git checkout release/2.1
# 下载并 apply cli.patch

git apply cli.patch
# 编译
./build.sh /t:Compile /p:Configuration=Release

如果不希望自己编译,可以使用我编译的版本

3. 复制 SDK 到 ARM 设备

在本地创建 /opt/dotnet/sdk 目录,并将 cli repo 下的 artifacts/linux-x64/stage2/sdk 目录的内容复制进去。

最终目录结构如下:

dotnet
├── host
│   └── fxr
├── sdk
│   └── 2.1.4-preview-007239
└── shared
   └── Microsoft.NETCore.App

到这一步, .NET SDK 就可以使用了,推荐使用root权限运行一次 dotnet nuget 命令,解压NugetFallbackFolder。

如果在运行 dotnet restore 命令时遇到问题,可以尝试使用 dotnet restore --disable-parallel解决。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注