「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[.NET Core]] --[[.NET On Rasbian]] ---[[Mono On Rasbian]] ---.NET Core On Rasbian * 目次 [#d0f75f1f] #contents *概要 [#pac9bc54] [[...>.NET On Rasbian#ic19f60e]]と言う事で、以下、[[Rasbian>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Linux%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3#taa02e60]]上で、[[.NET Core]]の開発を行う。 *詳細 [#l8d2dc69] **手順 [#k2e63f5b] 実際にやったログ ***準備 [#ga413351] [[コチラ(Windows 10 IoT Core)>Windows 10 IoT Core#a112e823]]で思い出す。 ***インストール [#p4010f98] 以下を参考に、Raspberry Pi 3 MODEL Bに[[Rasbian>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Rasbian]]をインストール。 -Rasbianをインストールする。 -Raspbianに[[Docker>コンテナ技術#la264095]]&[[Git]]をインストールする。 --アカウント系は開発環境でのみ設定。 --本番環境ではアカウントなしでPullするのみ。 >※ [[参考:インストール手順>#dc540116]](確か、NOOBSでインストールした ***.NET Core [#l4643021] 以下を参考に、.NET 5をインストール。 -手順 --インストール~ ([[Rasbian>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Linux%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3#taa02e60]]はDebian系) ---ダウンロード wget https://download.visualstudio.microsoft.com/download/pr/fada9b0c-202a-4720-817b-b8b92dddad99/fa6ace43156b7f73e5f7fb3cdfb5c302/dotnet-sdk-5.0.202-linux-arm.tar.gz ---解凍 mkdir -p "$HOME/dotnet" && tar zxf dotnet-sdk-5.0.202-linux-arm.tar.gz -C "$HOME/dotnet" --環境変数を設定 ---[[~/.profile>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95#ka3a7ade]]を[[sudo viで開いて編集>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?vi]]する。 ---vi生の利用はハードモードなので、~ ターミナルの機能のサポートがある~ [[VNCではなく、SSH経由での利用がイイ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Rasbian#qd29bc42]]。 sudo vi ~/.profile ---最下行に追加 export DOTNET_ROOT=$HOME/dotnet export PATH=$PATH:$DOTNET_ROOT --動作確認 ---バージョン確認 $ dotnet -v Unknown option: -v .NET SDK (5.0.202) 使用法: dotnet [runtime-options] [path-to-application] [arguments] ... ---開発実行確認 $ dotnet new console -o helloworld cd helloworld dotnet run -参考 --【C#】RaspberryPi 3に.NET Coreを入れてHello World!~ https://qiita.com/logikuma/items/de8c987dc2308a96256d --Raspberry Pi 4 に .NET 5 SDK をインストールする - matsujirushi’s blog~ https://qiita.com/logikuma/items/de8c987dc2308a96256d --Microsoft Docs ---Debian に .NET をインストールする - .NET~ https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-debian ---Ubuntu に .NET をインストールする - .NET~ https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu ***On Docker [#ud09ed44] (.NET Core On Docker On Rasbian)~ Rasbian上の.NET CoreのDockerコンテナで、helloworldをやってみる(た)。 -以下、試行錯誤の上に解ったこと。~ dotnet/dotnet-dockerをそのまま使用して動作確認をすると、~ Dockerfile.debian-arm32がRasbian上で動作したので切り分けができた。 --先ず、正規の、.NET 用の Dockerfileを探す。~ https://github.com/dotnet/dotnet-docker/blob/main/samples/dotnetapp/ --CPUアーキテクチャ、OS毎に異なるDockerfileを使用する。 ---ARM32/64イメージをx64マシンでビルド出来るが、実行は出来ないらしい。 ---[[Raspberry Pi 3はarm64だが、Raspbian上では、armv7互換モードで動作する。>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Rasbian#wb820e65]] --*.csprojファイルやDockerfileがあるフォルダに、~ binやobjフォルダがあると原因不明のエラーが発生するので、~ コレ等のフォルダを削除してから作業を行う必要がある。 --以下、ビルド ~ プッシュ作業は、~ Windows上で実施(Rasbian上での作業は[[コチラ>#xabae93e]]) -.NET 5 用の Dockerfileで[[前述のhelloworld>#l4643021]]をDockerビルドしてみる。~ https://github.com/dotnet/dotnet-docker/blob/main/samples/dotnetapp/Dockerfile --helloworldディレクトリに移動(CD)し、 --初めに、binやobjフォルダを削除する。 --上記の、.NET用の Dockerfileを配置する。~ (この際、エントリポイントのプロジェクト名のみ書き直す。) ---変更前 dotnetapp ---変更後 helloworld --以下の[[Dockerコマンド>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89]]でビルドする。 docker build -t helloworld . --ビルドしたコンテナを実行してみる。 ---コンテナの確認 >docker images REPOSITORY TAG IMAGE ID ... helloworld latest XXXXXXXX ... ---コンテナの実行 docker run helloworld Hello World! -コンテナをDocker Hubにプッシュして、Rasbian上で実行してみる。 --Docker Hubにプッシュ ---リネーム docker tag XXXXXXXX osscjpdevinfra/helloworld:latest ---ログイン >docker login Authenticating with existing credentials... Login Succeeded ---プッシュ >docker push osscjpdevinfra/helloworld:latest --コンテナの実行 ---PC上で実行~ ・ローカルのイメージを消しておく。 >docker rmi XXXXXXXX -f ... Deleted: sha256:... ・Docker HubからPullして実行。 >docker run osscjpdevinfra/helloworld:latest Unable to find image 'osscjpdevinfra/helloworld:latest' locally latest: Pulling from osscjpdevinfra/helloworld ... Status: Downloaded newer image for osscjpdevinfra/helloworld:latest Hello World! ---Rasbian上で実行~ 以下のように、exec format errorが起きる。~ (イメージは、linux/amd64だが、Rasbianはlinux/arm/v7と表示される)。 $ docker run osscjpdevinfra/helloworld:latest Unable to find image 'osscjpdevinfra/helloworld:latest' locally latest: Pulling from osscjpdevinfra/helloworld ... Status: Downloaded newer image for osscjpdevinfra/helloworld:latest WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested standard_init_linux.go:219: exec user process caused: exec format error -.NET 5 用の DockerfileをDockerfile.debian-arm32に変えて、同様にやってみる。~ https://github.com/dotnet/dotnet-docker/blob/main/samples/dotnetapp/Dockerfile.debian-arm32 --PC上で実行~ 動かない(イメージは、linux/armだが、PCはlinux/amd64と表示される)。 >docker run osscjpdevinfra/helloworld:net50-debian-arm32 WARNING: The requested image's platform (linux/arm) does not match the detected host platform (linux/amd64) and no specific platform was requested A fatal error occurred, the folder [/usr/share/dotnet/host/fxr] does not contain any version-numbered child folders --Rasbian上で実行(Docker Hub経由)~ 動いた(なお、debian-arm64だとPC上で動いて、Rasbian上で動かない)。 $ docker run osscjpdevinfra/helloworld:net50-debian-arm32 Unable to find image 'osscjpdevinfra/helloworld:net50-debian-arm32' locally net50-debian-arm32: Pulling from osscjpdevinfra/helloworld ... Digest: sha256:558763682161963dfc72879e17220ae62e0767b7727261a4219de840cf3c1439 Status: Downloaded newer image for osscjpdevinfra/helloworld:net50-debian-arm32 Hello World! ***Rasbian上でDockerビルド [#xabae93e] -同様に、Dockerfile.debian-arm32を使用してDockerビルド $ docker build -t helloworld:hoge . ... Successfully tagged helloworld:hoge -Rasbian上で実行(ローカル実行) $ docker run helloworld:hoge Hello World! ***[[Visual Studio Code]] [#fcd18b8e] 本格的な開発のため、[[Visual Studio Code]]環境を作ってみる。 -[[コチラにLinux上で構築した実績があるので>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?VM%E8%B5%B7%E5%8B%95%E5%BE%8C%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%EF%BC%88Linux%EF%BC%89#xa15e19f]]、早速、真似てみる。 -が、ダメ。確かに、ARM32だしね。...と言う事で、ググると以下が出てくる。 --Raspberry Pi OS に Visual Studio Code をインストールする - Qiita~ https://qiita.com/hikaru__m/items/09ac6b38a42e53074bbf $ sudo apt update $ sudo apt install code -無事インストールできたので、~ [[前述のhelloworld>#l4643021]]をデバック実行できるようにする。 --SSHからではなく、デスクトップかVNCからアクセスする。 --helloworldフォルダを右クリックし、[[Visual Studio Code]]を開く。 --エクステンションから、[[CSharp for Visual Studio Code]]をインストールする。 --ブレークポイントを設定して、[F5]実行を行ってみようと、~ [create a launch. json file]を押下したが、以下が出てダメ。 The C# extension for Visual Studio Code (powered by OmniSharp) is incompatible on linux armv7l ---Feature request: support Linux ARM / ARM64~ Issue #2771 · OmniSharp/omnisharp-vscode~ https://github.com/OmniSharp/omnisharp-vscode/issues/2771 ※ ...と言う事で、現時点の結論としては、[[OmniSharp]]のARM対応待ち。 **オプション [#g267c0db] ***リモートデバッグ(通常) [#cd46001b] -[[Visual Studio Codeのローカル・インストール>#fcd18b8e]]がダメだったので、リモートデバッグ。 --[[Visual Studio Code]]ならlaunch.jsonを使う。 --[[Visual Studio]]なら、launch.jsonを使用せずに接続可能。 -[[Visual Studio]]での手順~ [[WSL上での.NET Core開発 > Visual Studioからデバッガをアタッチする方法>WSL上での.NET Core開発#b8ef542f]]を参考に。 --Rasbian上で、ConsoleAppをdotnet runしておく。~ (必要に応じて、Console.ReadKey等を仕込んでおく) --上記を参考に、Windowsの[[Visual Studio]]からデバッガをアタッチする。 --デバッグ対象ファイルを開いて、ブレークポイントを指定する。 --キーを押下し、Console.ReadKeyを通過させてブレークする。 --[[Visual Studio]]では、以下は不要だった。 ---[[PuTTY]]のインストールや設定 ---vsdbgのインストールや設定 ---launch.jsonの作成 -[[Visual Studio Code]]での手順~ 未検証([[PuTTY]]入れたりするのが大変なので... -参考 --Raspberry Pi(Raspbian)上で動く~ .NET Core2.1アプリをリモートデバッグする - Qiita~ https://qiita.com/HiroyukiSakoh/items/ec947802dd2f69a38e8b ***リモートデバッグ(コンテナ) [#u4081ce6] -SSHを仕込んだベースイメージを[[Dockerビルドして、Docker Hubにプッシュする。>#ud09ed44]] -デバッグ対象のコンテナを[[Dockerビルドして、Docker Hubにプッシュする。>#ud09ed44]] -2222:22とマッピングしたSSHポートでリモートデバッグ可能。 -2222:22とマッピングしたSSHポートを使用してリモートデバッグする。 -参考 --VisualStudio2017でリモートデバッグ - Qiita~ https://qiita.com/alicial/items/cec59bea773b8058e7ba ***GUIサポート [#m2256d86] GUIに関しては、 -[[Mono On Rasbian]]を参照。 -最近は、[[Gtk Sharpの.NET Coreサポート>Gtk Sharp#t143947a]]も出てきている。 **実装 [#pca4ca96] [[Windows 10 IoT Coreでの実装>Windows 10 IoT Core#m9b9f8bf]]を参考にして実装してみよう。 ***[[Lチカを実装する。>Windows 10 IoT Core#g55fff11]] [#l41422bb] -ライブラリの名前空間が違うので、コードも少々変わる。 using System; using System.Device.Gpio; using System.Threading; namespace DotNet_LChika { class Program { static void Main(string[] args) { /// GpioPin #5は青色 /// GpioPin #6は白色 int pin = 6; GpioController controller = new GpioController(); controller.OpenPin(pin, PinMode.Output); int lightTimeInMilliseconds = 1000; int dimTimeInMilliseconds = 200; while (true) { Console.WriteLine($"Light for {lightTimeInMilliseconds}ms"); controller.Write(pin, PinValue.High); Thread.Sleep(lightTimeInMilliseconds); Console.WriteLine($"Dim for {dimTimeInMilliseconds}ms"); controller.Write(pin, PinValue.Low); Thread.Sleep(dimTimeInMilliseconds); } } } } -[[Dockerビルドして、Docker Hubにプッシュする。>#ud09ed44]] -Rasbian上でコンテナを実行([[Deviceアクセスを有効化して起動>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%20On%20Rasbian#y031f6c7]]) docker run --device /dev/gpiomem --privileged osscjpdevinfra/dotnet_lchika:net50-debian-arm32 >→ 無事、動作した。 -[[コンテナをリモート・デバッグ>#u4081ce6]]する場合 docker run -p 2222:22 --device /dev/gpiomem --privileged osscjpdevinfra/dotnet_lchika:net50-debian-arm32 >→ 未検証... ***[[LCDに文字を表示する。>Windows 10 IoT Core#t5995e43]] [#c41eecbb] → 未検証だが、多分動く。 ***[[センサーからデータを取得する。>Windows 10 IoT Core#j7e0332f]] [#zc62a6e3] → 未検証だが、多分動く。 **[[Windows 10 IoT Core]] [#f7a110ab] *参考 [#ad06f3a5] -詳説 .NET 5 のIoTサポート~ https://www.slideshare.net/TakashiMatsuoka2/net-5-iot **Qiita [#q179f182] -【C#】RaspberryPi 3に.NET Coreを入れてHello World!~ https://qiita.com/logikuma/items/de8c987dc2308a96256d -Raspberry Pi(Raspbian)上で動く.NET Core2.1アプリをリモートデバッグする~ https://qiita.com/HiroyukiSakoh/items/ec947802dd2f69a38e8b -ASP.NET Core webアプケーションを公開する~ https://qiita.com/takmot/items/ce3b6780e4e58c17d1a4 -Raspberry Pi C#でLチカ~ https://qiita.com/tana_/items/f24c861827179811f912 -C#でもIoTできるんだって!!~ RaspberryPiとC#使ってラジコン?的なの作る。~ https://qiita.com/Earthfreedom/items/1fd4194ccff4166782c9 **CodeZine(コードジン) [#lb1bd543] ***ラズベリーパイをつかったセンサープログラミング超入門連載一覧 [#g855d115] https://codezine.jp/article/corner/606 -Raspberry Piで電子工作をはじめよう!~ ~まずはRasbian(OS)のセットアップから (1/6)~ https://codezine.jp/article/detail/9027 -オームの法則覚えてますか? 電子工作の基礎を身につけ、~ Raspberry PiでLEDを光らせよう (1/3)~ https://codezine.jp/article/detail/9128 ***C#ではじめるラズパイIoTプログラミング連載一覧 [#le08dd63] https://codezine.jp/article/corner/792 -C#でもラズパイIoTができる! .Net Coreで環境構築しよう~ https://codezine.jp/article/detail/11677 -C#でラズパイのGPIOを操作しよう~LEDを点灯させる~ https://codezine.jp/article/detail/11733 -C#でラズパイに接続したディスプレイを制御してみよう~ https://codezine.jp/article/detail/11777 -C#でラズパイに接続したOLEDディスプレイに文字を描こう~ https://codezine.jp/article/detail/11793 -C#でラズパイに接続した温湿度センサーで計測しよう~ https://codezine.jp/article/detail/11995 **Microsoft [#vcb76f5f] ***Microsoft Docs [#a2059adf] -.NET の IoT ライブラリのドキュメント~ https://docs.microsoft.com/ja-jp/dotnet/iot/ -.NET IoT ライブラリを使用して IoT デバイス用のアプリを開発する~ https://docs.microsoft.com/ja-jp/dotnet/iot/intro -チュートリアル --LED を点滅させる~ https://docs.microsoft.com/ja-jp/dotnet/iot/tutorials/blink-led --LCD にテキストを表示する~ https://docs.microsoft.com/ja-jp/dotnet/iot/tutorials/lcd-display --センサーから環境条件を読み取る~ https://docs.microsoft.com/ja-jp/dotnet/iot/tutorials/temp-sensor ***GitHub [#q9b1dd5e] -dotnet/iot:~ This repo includes .NET Core implementations for various IoT boards, chips, displays and PCBs.~ https://github.com/dotnet/iot **開発基盤部会 Wiki [#dc540116] ***[[Rasbian>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Rasbian]] [#a00edb1a] ***[[Docker On Rasbian>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Docker%20On%20Rasbian]] [#v1d30162] ---- Tags: [[:インフラストラクチャ]], [[:IoT]], [[:Linux]], [[:.NET開発]], [[:.NET Core]]