俺のラズパイ3で.NET CoreなF#が動かないわけがない | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8028
の記事が去年の8月末で、あれからほぼ1年が経ちました。経っているうちに、.NET Coreが2.0のプレビュー版になって、.NET Coreが動くようになりましたよ、という話。
core/roadmap.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/roadmap.md#technology-roadmaps
Running a .NET Core 2 app on Raspbian Jessie, and deploying to the Pi with Cake | Jeremy Lindsay
https://jeremylindsayni.wordpress.com/2017/07/23/running-a-net-core-2-app-on-raspbian-jessie-and-deploying-to-the-pi-with-cake/
core/RaspberryPiInstructions.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md
<b>C#</b>RaspberryPi 3に.NET Coreを入れてHello World! – Qiita
http://qiita.com/logikuma/items/de8c987dc2308a96256d
.NET Core 1.0 ではいつの間にか消えてしまった Raspberry Pi のサポートですが、.NET 2.0 になって復活していました。
動作環境
- Raspberry Pi2と3の Rasbian/Ubuntu の環境で動く。
- Raspberry Pi Zero では動かない。
- Raspberry Pi 上ではビルドができない。
- なので、WindowsやLinux上でビルドして、Raspberry Pi へデプロイする。
つまり、実行環境としての.NET Core関連のアセンブリをラズパイへ入れ込めば動作する。ビルドする場合は、別のPC/Linux/Macが必要、という訳。Zeroで動かないのは、.NET Coreの動作対象が armv7とarmv8 となっているためで、zero が使っている arm32 は対象になっていない、ということです。
となると、armv7/8 の cpu を使っている arm 関係の組み込みボードでもいけそうでは?という予想が立つので、おそらく nano pi あたりでも動くはずです。
Rasbian Pi上で動かす
現状では、.NET Coreのランタイムが
- Rasbian(Raspberry Pi標準のOS)
- Ubuntu
- Windows IoT Core
上で動きます。Rasbianで動かすときは、Scratchとの連携とかnode.jsの代わりとか色々できそうです。Ubuntuは低電力の常時Webサーバーというのもありで、ちょっとしたサーバー機として使えます。Windows IoT Coreの場合は、モニタ絡みで先行きはUWP on .NET Standardな環境かなと思ったり。
自前ビルド環境がないのが辛いところですが(Rasbian/Ubuntuという開発環境なのに)、別途、.NET Core対応なコンパイラとかスクリプトを作れば、それはRaspberry Pi上でもするっと動くようになるのかなと思ったり、まあ、そういうときはmonoを使えばいい訳ですが。
さて、.NET Coreのランタイムかつアセンブリ(各種のDLLファイル)は、実行環境に何かのインストールをする必要はありません。すべて、ビルドするときのアセンブリで完結しています。ということは、Raspberry Pi 上でセルフビルドができないのですから、そもそも、何らかの.NET関係のアセンブリをインストールしておく必要はありません。
ということで、手順は簡単で、
- Raspberry Pi2/3でRasbianを用意する。
- PC上で、.NET Coreのプログラムを作る。
- PCからRaspberry Piにデプロイする(アセンブリをコピーする)
だけで十分です。
PC上で hello フォルダーを作成して dotnet new console します。
1 2 3 | mkdir hello cd hello dotnet new console |
あるいは
1 | dotnet new console -n hello |
Raspberry Pi のデプロイするために dotnet publish -r linux-arm します。
1 2 | dotent build dotnet publish -r linx-arm |
ここで一度 build していますが、Raspberry Pi に転送するだけならば、publish だけで十分かもしれません。
hello/bin/Debug/netcoreapp2.0/linux-arm/publish の中身に hello を含む .NET Core 2.0 用のアセンブリがごっそり作られます。
publish フォルダの中身を、WinSCP などで Raspberry Pi に転送します。
Tera Term などで Raspberry Pi に繋ぎ、転送した publish フォルダにある hello だけに実行権限を付けます。
1 2 | mv publish hello chmod +x hello/hello |
アセンブリに実行権限を付ける訳です。
後は、普通に hello を動かせば動作できます。
1 | ./hello |
※ラズパイ上の dotnet コマンドはバージョンしか出さないので、おそらく dotnet-runtime-latest-linux-arm.tar.gz をダウンロード&展開する必要はないハズです。
※実行権限を chmode 775 -R すると全てのアセンブリに設定してしまうので、ピンポイントで chmod +x しています。
追記 2017/07/31
arm 上の dotnet コマンドですが、pc/linux にあるような dotnet run コマンドがありません…が、アセンブリを実行するために、dotnet ./hello.dll ってのができますね。なるほど。以下な感じで最新版を取ってきて、展開して使えます。
1 2 3 4 | wget https://dotnetcli.blob.core.windows.net/dotnet/Runtime/release/2.0.0/dotnet-runtime-latest-linux-arm.tar.gz mkdir /opt/dotnet tar -xvf dotnet-runtime-latest-linux-arm.tar.gz -C /opt/dotnet ln -s /opt/dotnet/dotnet /usr/local/bin/dotnet |
のように /usr/local/bin/dotnet で動作できるようにしておいて
1 | dotnet ./hello.dll |
で実行します。PC/linux のほうにもこの機能はある。
このあたり、英語のブログ記事も錯綜している感じがするので、元ネタの
core/RaspberryPiInstructions.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md
を参照するとよいでしょう。
Ubuntu上で動かす
Ubuntu 上で動かすときも基本は Rasbian と変わりません。
ただし、素の Ubuntu の場合、開発的なライブラリが少し足りないので apt-get で追加しておきます。
core/prereqs.md at master ・ dotnet/core
https://github.com/dotnet/core/blob/master/Documentation/prereqs.md
にあるライブラリを以下で追加します。
1 | sudo apt- get install libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev libcurl4-openssl-dev libssl-dev uuid-dev unzip |
これで、さっき dotnet publish -r linux-arm で作ったアセンブリを ubuntu のほうにコピーすると同じように動作します。
IoTのテンプレートを使う。
ここでは console のテンプレートを使った訳ですが、実は dotnet new –list すると、console 以外のテンプレートも使えることが分かります。
aps.net mvc の場合は dotnet new mvc とかのアレのやつですね。
ここに coreiot というテンプレートがあって、
1 | dotnet new -i RaspberryPi.Template::* |
とするとインストールができます(既に .net core 2.0 の dotnet コマンドに付いるかもしれません)。
このテンプレートを使って、
1 | dotnet new coreiot -n helloiot |
とした後で、vscode を開くと build.cake にビルドからデプロイまでを含めたCake(C# の makefile)を作ってくれます。
ビルド用の ps スクリプトを,
1 | Invoke-WebRequest http: //cakebuild.net/download/bootstrapper/windows -OutFile build.ps1 |
でダウンロードして動かすと、pscp まで使ったデプロイまで一気にやってくれるはずなんですけどね…どうも PscpSettings の設定がうまくできていないらしく、うまく動いていません。
Cake – Home
http://cakebuild.net/
後でここは調べておきましょう。
そんな訳で
セルフビルドはできませんが、これで Rasberry Pi 2/3 上で .NET Core 2.0 が動作することが確認できました。これで何がやりたいかというと、F#でWeb APIが作りたいわけで、mono で作ってもよいのですが、どうせならば .net core + asp.net mvc core の組み合わせでやりたいのです。なんせ、PCよりも断然低電力なので常時立ち上げておいてもよいし、AzureやAWSよりもネットワーク的に近い位置に作れるから、これはこれで使い勝手がいいかなと。
と言う訳で、F#でのお試しは引き続き。