Die offene .NET Core-Plattform funktioniert auf fast allem: Windows, Mac und einem Dutzend Linux-Systemen. Es gibt aber auch ein SDK und Runtime. Bisher wurde das .NET Core SDK auf ARMv7 / ARMv8-Chips, auf denen der Raspberry Pi ausgeführt wird, nicht unterstützt. Aber alles hat sich geändert. Mehr darüber, wie man unter dem Schnitt läuft!
Dieser Artikel wurde von Scott Hanselman geschrieben . Ich gebe ihm das Wort.Ich mag den Raspberry Pi. Dies sind großartige kompakte Lernmaschinen, mit denen Kinder sehr gerne spielen. Selbst wenn diese Kinder Erwachsene sind, bilden sie
eine Gruppe von sechs Kubernetes Raspberry Pi-Knoten .
NET Core wird jetzt auf Linux ARM32-Distributionen wie Raspbian und Ubuntu unterstützt !Hinweis .NET Core 2.1 wird vom Raspberry Pi 2+ unterstützt. Es wird auf Pi Zero oder anderen Geräten mit einem ARMv6-Chip nicht unterstützt. Für die Arbeit mit .NET Core ist ein ARMv7- oder ARMv8-Chip wie ein ARM Cortex-A53 erforderlich. Spezialisten des Azure IoT Edge- Teams verwenden die .NET Core Bionic ARM32 Docker .NET-Images, um Entwickler beim Schreiben in C # auf Edge-Geräten zu unterstützen .
Es gibt zwei Möglichkeiten, .NET Core auf dem Raspberry Pi auszuführen.
Der erste Weg ist die
Verwendung von Docker . Dies ist buchstäblich der schnellste und einfachste Weg, um .NET Core auf einem Pi zum Laufen zu bringen. Es scheint unglaublich, aber solche kleinen Raspberry Pi-Geräte unterstützen Docker-Plattformcontainer perfekt. Dies kann in wenigen Minuten erfolgen. Um Docker schnell zu installieren, benötigen Sie:
curl -sSL https:
Nach der Installation von Docker müssen Sie sich anmelden und abmelden. Schauen Sie sich ein kleines Beispiel an, um sicherzustellen, dass .NET Core ordnungsgemäß funktioniert. Sie können die verfügbaren Docker-Tags unter anzeigen und hier mehr über .NET Core Docker-Vorlagen erfahren.
Jetzt kann ich einfach Docker starten und dann den Befehl "dotnet --info" ausführen, um mehr über dotnet auf meinem Pi zu erfahren.
pi@raspberrypi:~ $ docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info .NET Core SDK (reflecting any global.json): Version: 2.1.300-rc1-008673 Commit: f5e3ddbe73 Runtime Environment: OS Name: debian OS Version: 9 OS Platform: Linux RID: debian.9-x86 Base Path: /usr/share/dotnet/sdk/2.1.300-rc1-008673/ Host (useful for support): Version: 2.1.0-rc1 Commit: eb9bc92051 .NET Core SDKs installed: 2.1.300-rc1-008673 [/usr/share/dotnet/sdk] .NET Core runtimes installed: Microsoft.NETCore.App 2.1.0-rc1 [/usr/share/dotnet/shared/Microsoft.NETCore.App] To install additional .NET Core runtimes or SDKs: https:
Das ist einfach toll! Jetzt fordere ich nur dotnet: 2.1-sdk auf dem Raspberry Pi (RPi) an, und da sie Docker-Dateien mit mehreren Architekturen verwenden, funktioniert die Plattform ordnungsgemäß. Wenn Sie
.NET Core mit Docker auf ARM32 verwenden möchten , können Sie eines der folgenden Tags verwenden.
Hinweis Die ersten drei Tags sind Multi-Arch und Bionic für Ubuntu 18.04. Der Codename ist Stretch für Debian 9. Also verwende ich 2.1-sdk und es funktioniert gut auf meinem RPi, aber ich kann genauer sein, wenn ich will.
- 2.1-sdk
- 2.1-Laufzeit
- 2.1-Aspnetcore-Laufzeit
- 2.1-SDK-Stretch-Arm3
- 2.1-Laufzeit-Stretch-Slim-Arm32v7
- 2.1-Aspnetcore-Laufzeit-Stretch-Slim-Arm32v7
- 2.1-sdk-bionic-arm32v7
- 2.1-runtime-bionic-arm32v7
- 2.1-aspnetcore-runtime-bionic-arm32v7
Versuchen Sie es in wenigen Minuten auf folgende Weise:
docker run --rm microsoft/dotnet-samples:dotnetapp
Hier lädt er das Bild herunter ...

In früheren Versionen von .NET Core Docker-Dateien funktionierte dies nicht, wenn Sie das x64-Image auf ARM ausführten.
standard_init_linux.go:190: exec user process caused "exec format error"
Verschiedene Prozessoren! Mit
Multi- Architektur-
Tags von Kendra Havens von Microsoft funktioniert in Version 2.1 alles einwandfrei.
Docker verfügt über eine Multi- Architektur- Funktion , die seit kurzem in Microsoft / Dotnet-Nightly eingesetzt wird . In naher Zukunft ist geplant, dies in das offizielle Microsoft / Dotnet-Repository zu übertragen . Mit der Multi-Architektur-Funktion können Sie ein Tag für mehrere Maschinenkonfigurationen verwenden. Ohne diese Funktion ist für jede Architektur / jedes Betriebssystem / jede Plattform ein eindeutiges Tag erforderlich. Beispielsweise basiert das Tag microsoft / dotnet: 1.0-runtime auf Debian und das Tag microsoft / dotnet: 1.0-runtime-nanoserver auf dem Nano Server. Bei Multi-Architekturen wird nur ein gemeinsames Microsoft / Dotnet-Tag benötigt: 1.0-Laufzeit. Wenn Sie dieses Tag aus der Linux-Containerumgebung übernehmen, erhalten Sie ein Image, das auf Debian basiert. Wenn Sie es aus der Windows-Containerumgebung übernehmen, erhalten Sie ein Image, das auf Nano Server basiert. Auf diese Weise wird sichergestellt, dass die Tags in der Docker-Umgebung konsistent sind, wodurch Verwirrung vermieden wird.
In den obigen Beispielen kann ich Folgendes tun:
Führen Sie eine vorkonfigurierte Anwendung in einem Docker-Image aus, zum Beispiel:
docker run --rm microsoft/dotnet-samples:dotnetapp
Führen Sie Dotnet-Befehle in einem SDK-Image aus, zum Beispiel:
docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info
Starten Sie ein interaktives Terminal in einem SDK-Image, zum Beispiel:
docker run --rm -it microsoft/dotnet:2.1-sdk
Als kleines Beispiel werde ich hier in den Container gehen und eine kleine Konsolenanwendung hinzufügen und ausführen, um zu beweisen, dass dies möglich ist. Alles wird gelöscht, wenn ich den Container verlasse.
pi@raspberrypi:~ $ docker run --rm -it microsoft/dotnet:2.1-sdk root@063f3c50c88a:/# ls bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var root@063f3c50c88a:/# cd ~ root@063f3c50c88a:~# mkdir mytest root@063f3c50c88a:~# cd mytest/ root@063f3c50c88a:~/mytest# dotnet new console The template "Console Application" was created successfully. Processing post-creation actions... Running 'dotnet restore' on /root/mytest/mytest.csproj... Restoring packages for /root/mytest/mytest.csproj... Installing Microsoft.NETCore.DotNetAppHost 2.1.0-rc1. Installing Microsoft.NETCore.DotNetHostResolver 2.1.0-rc1. Installing NETStandard.Library 2.0.3. Installing Microsoft.NETCore.DotNetHostPolicy 2.1.0-rc1. Installing Microsoft.NETCore.App 2.1.0-rc1. Installing Microsoft.NETCore.Platforms 2.1.0-rc1. Installing Microsoft.NETCore.Targets 2.1.0-rc1. Generating MSBuild file /root/mytest/obj/mytest.csproj.nuget.g.props. Generating MSBuild file /root/mytest/obj/mytest.csproj.nuget.g.targets. Restore completed in 15.8 sec for /root/mytest/mytest.csproj. Restore succeeded. root@063f3c50c88a:~/mytest# dotnet run Hello World! root@063f3c50c88a:~/mytest# dotnet exec bin/Debug/netcoreapp2.1/mytest.dll Hello World!
Wenn Sie es selbst versuchen, werden Sie feststellen, dass der Befehl dotnet run langsam ist. Dies liegt daran, dass Wiederherstellung, Erstellung und Start durchgeführt werden. Die Kompilierung geht auf diesen winzigen Geräten nicht zu schnell. Daher lohnt es sich, so wenig wie möglich zu arbeiten. Anstatt dotnet run die ganze Zeit auszuführen, werde ich den Befehl dotnet build und dann dotnet exec ausführen, die sehr schnell sind.
Wenn Sie Docker und .NET Core ausprobieren möchten, sind diese
Ressourcen für Sie unglaublich nützlich.
Erstellen von .NET Core-Anwendungen mit Docker
Erstellen von .NET Core-Anwendungen in einem Container
Optimierung der Behältergröße
ARM32 / RASPBERRY PI
Es scheint mir, dass
diese Beispiele sehr nützlich sind ... Schauen Sie sich unbedingt die Docker-Dateien selbst an, da sie Ihnen eine Vielzahl von Informationen zum Strukturieren Ihrer eigenen Dateien geben. Die Möglichkeit, mehrstufige Docker-Dateien zu erstellen, ist bei der Arbeit mit einem kleinen Gerät wie RPi von entscheidender Bedeutung. Es ist ratsam, so wenig Arbeit wie möglich zu erledigen und Docker so viele Ebenen wie möglich automatisch zwischenspeichern zu lassen. Wenn Sie nicht über diesen Punkt nachdenken, werden Sie am Ende zehnmal so viel Zeit damit verbringen, Bildebenen für jede Baugruppe zu erstellen.
Übersetzung einer echten ASP.NET-Site auf Docker mit Tests!
Kann ich meine Site mit Podcasts auf Docker übertragen und sie auch auf Raspberry Pi erstellen / testen / ausführen? Ja!
FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /app # copy csproj and restore as distinct layers COPY *.sln . COPY hanselminutes.core/*.csproj ./hanselminutes.core/ COPY hanselminutes.core.tests/*.csproj ./hanselminutes.core.tests/ RUN dotnet restore # copy everything else and build app COPY . . WORKDIR /app/hanselminutes.core RUN dotnet build FROM build AS testrunner WORKDIR /app/hanselminutes.core.tests ENTRYPOINT ["dotnet", "test", "--logger:trx"] FROM build AS test WORKDIR /app/hanselminutes.core.tests RUN dotnet test FROM build AS publish WORKDIR /app/hanselminutes.core RUN dotnet publish -c Release -o out FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime WORKDIR /app COPY --from=publish /app/hanselminutes.core/out ./ ENTRYPOINT ["dotnet", "hanselminutes.core.dll"]
Großartig Jetzt kann ich den Docker-Build-Befehl ausführen. auf dem Raspberry Pi. Das Gerät wird es wiederherstellen, testen und erstellen. Wenn der Test fehlschlägt, schlägt der Docker-Build fehl.
Sie sehen, es gibt einen zusätzlichen Abschnitt namens "Testrunner" und danach "Test?" Dieser Abschnitt funktioniert nicht. Es setzt ENTRYPOINT, aber niemand benutzt es jemals ... für jetzt. ENTRYPOINT ist ein impliziter Start, wenn er sich in der letzten Zeile der Docker-Datei befindet. Dies geschieht, damit ich ihn finden kann, wenn ich will.
Ich kann es einfach bauen und so laufen lassen:
docker build -t podcast . docker run --rm -it -p 8000:80 podcast
Hinweis Beachten Sie, dass das Bild "Laufzeit" Microsoft / Dotnet: 2.1-Aspnetcore-Laufzeit ist, nicht Microsoft / Dotnet: 2.1-Laufzeit. Außerdem enthält aspnetcore one zuvor den Binärcode, der zum Ausführen der ASP.NET-Anwendung erforderlich ist, sodass ich nur einen Link zu "/>" in csproj einfügen kann. Wenn Sie das Aspnetcore-Runtime-Basisimage nicht verwenden würden, müssten Sie alle benötigten ASP.NET Core-Pakete manuell aktivieren. Durch die Verwendung eines Basisbilds können die endgültigen Bilddateien größer werden. Dies ist jedoch nur ein Gleichgewicht zwischen Benutzerfreundlichkeit und Größe. Es liegt an dir. Sie können nur die benötigten Pakete manuell aktivieren oder das Metapaket "Microsoft.AspNetCore.App" verwenden. Mein letztes Podcast-Bild wog 205 Megabyte, was nicht schlecht ist, aber wenn ich wollte, könnte ich es natürlich auf verschiedene Arten reduzieren.
Und wenn ich nur
Testergebnisse von Docker benötige, kann ich sie bekommen! Dies bedeutet, dass ich den Test im Docker-Container ausführen, das Volume zwischen dem Linux-Container und dem (theoretischen) Windows-Host bereitstellen und dann die resultierende TRX-Datei in Visual Studio öffnen kann!
docker build --pull --target testrunner -t podcast:test . docker run --rm -v D:\github\hanselminutes-core\TestResults:/app/hanselminutes.core.tests/TestResults podcast:test
Schau mal! Dies sind die Testergebnisse, die in einem Linux-Container durchgeführt wurden:

Hier ist das Ergebnis. Jetzt habe ich eine Podcast-Site in Docker auf dem ARM32 Raspberry Pi 3, und ich habe nur eine Stunde gebraucht, um zu arbeiten (Schreiben einer Docker-Datei)!
Der zweite Weg. Hast du diesen Punkt erreicht? Sie können das .NET Core 2.1 SDK einfach auf der Hardware installieren. Docker wird nicht benötigt, laden Sie einfach tar.gz herunter und konfigurieren Sie es. Ich kann es auf einem
Gerät wie RPI ARM32v7 Dockerfile installieren . Beachten Sie, dass ich dabei eine gemeinsame ASP.NET Core * Laufzeit und * .NET Core SDK habe. In der endgültigen Version erhalten Sie ein SDK, das alles enthält, einschließlich ASP.NET.
$ sudo apt-get -y update $ sudo apt-get -y install libunwind8 gettext $ wget https:
Es lebe plattformübergreifend!