しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Raspberry Pi 2 にインストールした Windows 10 IoT Core 上で DNX と ASP.NET 5 アプリケーションを動かしてみた

ちょっと前に Raspberry Pi 2 の Windows 10 IoT Core で DNX を動かしたという話を Twitter で見たので、実際に自分でも動かすことが可能なのか試してみました。

てっきり Mono を使ったのかと思いましたが、1.0.0-beta6 からは DNX の Windows CoreCLR 向けバージョンに ARM アーキテクチャ版が追加されていたようです。

ちなみに、まだ Windows 向けのみで Linux や Darwin には x64 のみが提供されています。

本来なら Windows 10 IoT Core に直接 DNVM と DNX をインストールしていきたいですが、PowerShell の関係でインストール不可能なので別の方法をとります。

最新の DNX をインストール

まずは以下のコマンドを使って、最新の ARM 向け DNX を普通の Windows にインストールしておきます。

dnvm upgrade -u -r coreclr -arch arm -nonative

当然ながらこれでインストールした DNX はアーキテクチャが異なるので実行できません。

ARM 版の DNX をインストールした後に、今度は x86 版の DNX もインストールします。以下のコマンドを実行するだけで簡単にインストール可能です。

dnvm upgrade -u -r coreclr

これで dnu コマンドが使えるようになりました。CoreCLR 版を入れておかないと、この後の作業ではまるので注意しておきましょう。

インストールされた DNX を dnvm list コマンドで確認しておきます。

ARM 版じゃなくて x86 版が選択された状態になっているはずです。これで DNX の準備は出来ました。

アプリケーションを配布用にビルド

サンプルアプリケーションを用意するのがめんどくさかったので、いつも通り Home リポジトリ内の ConsoleApp を使って試していきます。ソースは clone するか zip でダウンロードしておきます。

手順としては、いつも通り dnu restore でパッケージを復元します。

この時は x86 版の DNX を使って実行していることがわかります。dnu restore に成功したら、配布用にアプリケーションをビルドしていきます。

配布用のビルドには dnu publish コマンドを使いますが、この時にオプションとしてランタイムを指定出来るようになっているので、ARM 版 DNX のパスを渡すようにします。

dnu publish --runtime "C:\Users\shibayan\.dnx\runtimes\dnx-coreclr-win-arm.1.0.0-beta6-12120"

実行する際にはユーザー名の部分だけを、各自の環境向けに変更してください。

コマンドを実行すると ARM 版 DNX を使ってビルドされていることが確認できますね。ビルド結果はプロジェクトディレクトリの bin\output 以下に出力されています。

Windows 10 IoT Core をインストール

アプリケーション側の準備が出来たので、今度は Raspberry Pi 2 に Windows 10 IoT Core をインストールしていきます。今は最新の 10152 がリリースされているので、これを使いました。

https://ms-iot.github.io/content/en-US/win10/SetupRPI.htm

手順は上のページの通りで問題ないです。イメージを焼くためのヘルパーが追加されたので便利です。

Windows 10 IoT Core のインストールが終われば、PowerShell を使って Raspberry Pi 2 へ接続します。手順は以下のページの通りなので説明は省略します。

https://ms-iot.github.io/content/en-US/win10/samples/PowerShell.htm

初回の接続には少し時間がかかりましたが、その後は割と快適に動作するはずです。

DNX でアプリケーションを実行

PowerShell での接続が確認できれば、FTP を使ってビルドしたアプリケーションを Raspberry Pi 2 上へコピーします。FTP は資格情報なしで使えるようになっています。

コピーが終わったら、PowerShell でそのディレクトリまで移動して、ConsoleApp.cmd を実行します。

スクリーンショットでは分かりにくいですが Hello World が出力されています。DNX が動いている証拠です。

コンソールアプリだけだと動いている感がいまいち出ないので、今度は HelloMvc アプリケーションを動かしてみます。手順としては全く同じですが、デフォルトだとエラーになるので project.json を一部修正します。

localhost を + に置き換えると、外からでも HTTP でアクセスできるようになります。

HelloMvc アプリケーションでも、同じように ARM 版 DNX を使ってビルドを行い、Raspberry Pi 2 上に FTP で一式をコピーします。そして web.cmd を PowerShell から叩くだけです。

やはり MVC 6 は起動までに時間が少しかかりますが、暫くするとサーバーが立ち上がります。

他のマシンのブラウザからアクセスすると、あっさりと MVC 6 のテンプレートページが表示されました。

x86 / x64 アーキテクチャの Windows マシンで開発したアプリケーションであっても、ビルド時にランタイムの指定を行うだけで ARM 上で動作するのはかなり驚きでした。

DNX Core 向けのアセンブリは最初からプラットフォームに依存しない形になっているので、コンソールアプリケーションを作る場合には DNX は便利に使えそうです。