「[[マイクロソフト系技術情報 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]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS