.NET Core on BeagleBone Green(Debian 9.1)

BeagleBone Greenで.NET Coreを動かしてみました。

動機

BeagleBone GreenでAzure IoT Edgeが動くか試していて、Cサンプルが動くところまでは出来ました。 でも、Cだと開発がツライ。できればC#使いたい。ので、.NET Coreをインストールしたのですが、packageが無いとエラーに。

debian@beaglebone:~/iot-edge/build$ sudo apt-get install dotnet-sdk-2.0.0
E: Unable to locate package dotnet-sdk-2.0.0

そもそも、BeagleBone Greenで.NET Coreって動くのか? ということで、調べることにしました。

.NET Core for Linuxはx64だけ

.NET Core 2.0 - Supported OS versionsによると、対応アーキテクチャはx64だけで、ARMは対応外orz

.NET Core 2.0 RuntimeだけならARM32あり

でも、こんな素敵なブログが!

Setting up Raspian and .NET Core 2.0 on a Raspberry Pi

これによると、.NET Coreアプリケーションの開発や実行は、

  • .NET Core Runtime
  • .NET Core SDK
  • IDE Tools

の3つのコンポーネントに分かれていて、.NET Core RuntimeはARM32でも動くと書いてあります。

RuntimeのDaily Buildsがここにあって、ARM32に相当するLinux(armhf)が存在することが確認できます。

やってみる

BeagleBone Greenのファームウェアを最新にアップデートして、先のブログの手順を実施してみます。

なお、使ったファームウェアはbone-debian-9.1-iot-armhf-2017-08-31-4gb.img。

BeagleBone Greenに.NET Core Runtimeをインストール

Setting up Raspian and .NET Core 2.0 on a Raspberry PiのTask: Install the .NET Core Runtime on the Raspberry Pi.を実行します。

debian@beaglebone:~$ curl -sSL -o dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Runtime/release/2.0.0/dotnet-runtime-latest-linux-arm.tarr.gz
debian@beaglebone:~$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
debian@beaglebone:~$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin

何事もなく終了。

.NET Coreアプリケーションを用意

.NET Coreアプリケーションは、Windows PCのVisual Studioで開発します。

プロジェクトの新規作成で、コンソールアプリ(.NET Core)を選択し、コンソールに適当に表示するコードを用意します。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello BBG!");
            Console.ReadLine();
        }
    }
}

.NET Coreアプリケーションをlinux-arm用に作成して、BeagleBone Greenへコピー

BeagleBone Greenへ持っていく実行ファイル群をWindows PCでdotnet publishコマンドで作成してから、ファイル転送しなければいけません。

具体的には、.csprojのフォルダで、dotnet publish -r linux-armを実行します。

C:\Users\takashi\Desktop\netcore\ConsoleApp1>dotnet publish -r linux-arm

すると、プロジェクト配下のbin\Debug\netcoreapp2.0\linux-armフォルダとbin\Debug\netcoreapp2.0\linux-arm\publishフォルダにそれらしいファイルが出来上がるので、publishフォルダの中身すべてをBeagleBone Greenへコピーします。わたしは、zip圧縮してからTeraTermSSH SCPでコピーしました。

f:id:matsujirushix:20170919180907p:plain

BeagleBone Greenで.NET Coreアプリケーションを実行

コピーした.NET Coreアプリケーションに実行属性が付いていないので、実行属性を付けてから実行します。

debian@beaglebone:~/netcore$ chmod a+x ConsoleApp1
debian@beaglebone:~/netcore$ ./ConsoleApp1
Hello BBG!

動いた!!!

おまけ

  • .NET Core Runtimeをインストールせずに.NET Coreアプリケーションを実行すると下記のエラーが発生する。
debian@beaglebone:~/netcore$ ./ConsoleApp1
Failed to load 
, error: libunwind.so.8: cannot open shared object file: No such file or directory
Failed to bind to CoreCLR at '/home/debian/netcore/libcoreclr.so'
  • .NET Core Runtimeをインストールするとディスクを約52Mbytes消費した。
  • Debugging .NET Core on Linux #5を参考にリモートデバッグを試したがプロセス一覧から選択した先で接続がプッツリ切れてデバッグできない。(.NET Core Runtimeだけではダメなのかな)