How to install .NET Core on Raspberry Pi
.NET Core is a cross-platform version of .NET and its going everywhere. So here is my tale on how I got .NET Core running on Raspberry Pi 3B.
I have used RPI earlier running Windows 10 IoT and it was a very familiar experience as I have been more of a Windows guy for few decades. My non-Windows experience comes from working on Yocto Linux version for an embedded project and writing firmware on it.
Since the release of .NET Core, I wanted to experiment on non-Windows platforms, since .NET Core is a cross-platform version of .NET for building websites, services, and console apps. Other benefit is that we can run docker also on Raspberry Pi. So let us get started.
How to install Raspberry Pi?
Installing Raspberry Pi OS on an SD Card to boot the Raspberry Pi is pretty simple. You can go through the steps as mentioned here.
Lets check the Steps
- Download .NET Core 3.1/.NET 5.0
- Install .NET Core 3.1/5.0
- Setting up path to make it work in all terminal session
- Testing the install
- First .NET Core Console App
- SSH into RPI from Windows
Download .NET Core
You can either use the Raspberry PI desktop UI or command line wget
Use the gzip version, I am using RPI 3B here.
Download .NET Core 3.1 => sdk-3.1.301-linux-arm32-binaries
https://dotnet.microsoft.com/download/dotnet-core/3.1
Download .NET 5.0 => sdk-5.0.102-linux-arm32-binaries
https://dotnet.microsoft.com/download/dotnet/5.0
Install .NET Core
Lets see the details for each command line
- Create a folder called ‘dotnet’ inside the RPI HOME directory.
- Next we extract the downloaded .gz file into the ‘dotnet’ folder we created (3.1 / 5.0).
- Create an environment variable ‘DOTNET_ROOT’
- Also add the folder to PATH variable
sudo mkdir -p $HOME/dotnet
sudo tar zxf dotnet-sdk-3.1.100-linux-arm.tar.gz -C $HOME/dotnet
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
Keep in mind, above steps work only for the current terminal session. In order to make it work in all terminal sessions we need few additional steps.
Enable ‘Show hidden’ files in the File Manager (CTRL-H) on RPI. You can find a file ‘/home/pi/.bashrc’ after that. Add the following 2 statements in this file at the end.
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet
Time to test the install
If the output looks like below, its a confirmation that installation went through and now .NET Core is ready on your RPI.
pi@raspberrypi:~ $ dotnet --version
3.1.100
pi@raspberrypi:~ $ dotnet --info
.NET Core SDK (reflecting any global.json):
Version: 3.1.100
Commit: cd82f021f4
Runtime Environment:
OS Name: raspbian
OS Version: 10
OS Platform: Linux
RID: linux-arm
Base Path: /home/pi/dotnet/sdk/3.1.100/
Host (useful for support):
Version: 3.1.0
Commit: 65f04fb6db
.NET Core SDKs installed:
3.1.100 [/home/pi/dotnet/sdk]
.NET Core runtimes installed:
Microsoft.AspNetCore.App 3.1.0 [/home/pi/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.0 [/home/pi/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
First .NET Core Hello World Console App on RPI
Create a folder for the project, switch to the new folder. Create a new ‘Hello World’ console app and run it. Command output should look similar to what is given below
pi@raspberrypi:~ $ mkdir helloworld
pi@raspberrypi:~ $ cd helloworld/
pi@raspberrypi:~/helloworld $ dotnet new console
The template "Console Application" was created successfully.
Processing post-creation actions...
Running 'dotnet restore' on /home/pi/helloworld/helloworld.csproj...
Restore completed in 854.14 ms for /home/pi/helloworld/helloworld.csproj.
Restore succeeded.
pi@raspberrypi:~/helloworld $ dotnet run
Hello World!
Let us check the program content
pi@raspberrypi:~/helloworld $ cat Program.cs
using System;
namespace helloworld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
Connecting to RPI from Windows using SSH
Use ifconfig from terminal console on RPI, to find the IP address of RPI. Since I am connected to WIFI IP is listed under wlan0. And the IP address is 192.168.1.31 in my case.
$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:b2:58:4c:de txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:70:2c:f4 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.31 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::ba5c:5716:203c:9a89 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:25:79:a1 txqueuelen 1000 (Ethernet)
RX packets 228870 bytes 308078058 (293.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 113567 bytes 11037680 (10.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
I am running the ssh command from PowerShell console. But you can do the same from any command-line.
PS C:\> ssh pi@192.168.1.31
pi@192.168.1.31's password:
Linux raspberrypi 4.19.118-v7+ #1311 SMP Mon Apr 27 14:21:24 BST 2020 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jul 7 14:39:19 2020 from 192.168.1.18
pi@raspberrypi:~ $
Hopefully this has helped you to setup the RPI with .NET Core easily. The steps should be very similar for running .NET Core on other Linux platforms.
Really helpful. Thank you for this “how to” guide.
LikeLike
Thank you for your feedback.
LikeLike
Hi, thanks. Should I install dotnet core 3.1 or dotnet 5 or both ?
I try to run windows forms on a rpi4
LikeLike
You can install 5.0 or 6 RC2 (or wait for a month and install 6.0 released version too).
3.1 and 6.0 are LTS versions which means Long Term Supported. But for DIY it doesn’t matter anyway.
LikeLike
Winforms (UI apps) are not supported. If you want to build multi platform UI apps, check QT.
LikeLike
Hello, can I please have your e-mail id?
LikeLike
For what?
LikeLike
Hello, got to watch your discussion regarding the IoT on YT, would like to check with you regarding that, if possible
LikeLike
I don’t have a YT channel, so not sure what you are talking about. My social media accounts are on this website, top right to reach me.
LikeLike
Sorry for the confusion. Actually, I happened to hear a conversation of yourself regarding the topic IoT in some YT channel.
LikeLike