A plataforma aberta do .NET Core funciona em quase tudo: Windows, Mac e uma dúzia de sistemas Linux. Mas há também um SDK e Runtime. Anteriormente, o .NET Core SDK não era suportado nos chips ARMv7 / ARMv8 que executam o Raspberry Pi. Mas tudo mudou. Mais sobre como executar sob o corte!
Este artigo foi escrito por Scott Hanselman . Eu dou a ele a palavra.Eu gosto do Raspberry Pi. São ótimas máquinas compactas de aprendizado e as crianças gostam muito de brincar com elas. Mesmo que essas crianças sejam adultas, elas
criam um cluster de seis nós Kubernetes Raspberry Pi .
O NET Core agora é suportado em distribuições Linux ARM32 como Raspbian e Ubuntu !Nota O .NET Core 2.1 é suportado no Raspberry Pi 2+. Não é suportado no Pi Zero ou em outros dispositivos com um chip ARMv6. Para trabalhar com o .NET Core, é necessário um chip ARMv7 ou ARMv8, como um ARM Cortex-A53. Os especialistas da equipe do Azure IoT Edge usam as imagens .NET Core Bionic ARM32 Docker .NET para oferecer suporte a desenvolvedores que escrevem em C # em dispositivos Edge .
Existem duas maneiras de executar o .NET Core no Raspberry Pi.
A primeira maneira é
usar o Docker . Essa é literalmente a maneira mais rápida e fácil de executar o .NET Core em um Pi. Parece inacreditável, mas esses pequenos dispositivos Raspberry Pi suportam perfeitamente os contêineres da plataforma Docker. Isso pode ser feito em minutos. Para instalar rapidamente o Docker, você precisará de:
curl -sSL https:
Após instalar o Docker, você deve efetuar login e sair. Confira um pequeno exemplo para garantir que o .NET Core esteja funcionando corretamente. Você pode ver as tags disponíveis do Docker
em e saber mais sobre os modelos do .NET Core Docker
aqui .
Agora posso iniciar o Docker e executar o comando "dotnet --info" para descobrir sobre o dotnet no meu Pi.
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:
Isso é ótimo! Agora, apenas solicito o dotnet: 2.1-sdk no Raspberry Pi (RPi) e, como eles usam arquivos de arquitetura múltipla do Docker, a plataforma funciona corretamente. Se você quiser usar o
.NET Core com Docker no ARM32 , poderá usar qualquer uma das seguintes tags.
Nota As três primeiras tags são multi-arch e biion para o Ubuntu 18.04. O nome do código é estendido para o Debian 9. Portanto, eu uso o 2.1-sdk e funciona bem no meu RPi, mas posso ser mais específico se quiser.
- 2.1-sdk
- 2.1 tempo de execução
- 2.1-aspnetcore-runtime
- 2.1-sdk-stretch-arm3
- 2.1-runtime-stretch-slim-arm32v7
- 2.1-aspnetcore-runtime-stretch-slim-arm32v7
- 2.1-sdk-biion-arm32v7
- 2.1-runtime-biion-arm32v7
- 2.1-aspnetcore-runtime-biion-arm32v7
Tente em minutos desta maneira:
docker run --rm microsoft/dotnet-samples:dotnetapp
Aqui ele baixa a imagem ...

Nas versões anteriores dos arquivos do .NET Core Docker, isso não funcionaria se você executasse a imagem x64 no ARM.
standard_init_linux.go:190: exec user process caused "exec format error"
Processadores diferentes! Mas com as
tags de arquitetura
múltipla da Kendra Havens da Microsoft, tudo funciona bem na versão 2.1.
O Docker possui um recurso de multi- arquitetura que recentemente começou a ser usado em microsoft / dotnet-nightly . Em um futuro próximo, está planejado transferir isso para o repositório oficial da microsoft / dotnet . O recurso de arquitetura múltipla permite que você use uma tag para várias configurações da máquina. Sem esse recurso, uma tag exclusiva é necessária para cada arquitetura / OS / plataforma. Por exemplo, a tag microsoft / dotnet: 1.0-runtime é baseada no Debian, e a tag microsoft / dotnet: 1.0-runtime-nanoserver está no Nano Server. Com a arquitetura múltipla, apenas uma tag microsoft / dotnet comum será necessária: 1.0-runtime. Se você pega essa tag no ambiente de contêiner Linux, obtém uma imagem baseada no Debian, enquanto que se você pega no ambiente de contêiner do Windows, obtém uma imagem baseada no Nano Server. Isso ajuda a garantir que as tags sejam consistentes no ambiente do Docker, evitando confusões.
Nos exemplos acima, posso fazer o seguinte:
Execute um aplicativo pré-configurado dentro de uma imagem do Docker, por exemplo:
docker run --rm microsoft/dotnet-samples:dotnetapp
Execute comandos dotnet em uma imagem SDK, por exemplo:
docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info
Inicie um terminal interativo em uma imagem SDK, por exemplo:
docker run --rm -it microsoft/dotnet:2.1-sdk
Como um pequeno exemplo, aqui vou entrar no contêiner, adicionar um pequeno aplicativo de console e executá-lo, apenas para provar que isso é possível. Tudo será excluído quando eu sair do contêiner.
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!
Se você tentar você mesmo, notará que o comando dotnet run está lento. Isso ocorre porque ele executa recuperação, compilação e inicialização. A compilação não é muito rápida nesses pequenos dispositivos. Portanto, vale a pena fazer o mínimo de trabalho possível. Em vez de executar o dotnet run o tempo todo, executarei o comando dotnet build e, em seguida, o exec do dotnet, que é muito rápido.
Se você tentar o Docker e o .NET Core, esses
recursos serão incrivelmente úteis para você.
Criando aplicativos .NET Core usando o Docker
Criando aplicativos .NET Core em um contêiner
Otimização do tamanho do contêiner
ARM32 / FRAMBOESA PI
Parece-me que
esses exemplos são muito úteis ... Verifique os arquivos do Docker, pois eles fornecerão uma quantidade enorme de informações sobre como estruturar seus próprios arquivos. A capacidade de criar arquivos Docker de vários estágios é crítica ao trabalhar em um dispositivo pequeno, como o RPi. É recomendável fazer o mínimo de trabalho possível e deixar o Docker armazenar em cache automaticamente o maior número possível de camadas. Se você não pensar nesse ponto, vai gastar 10 vezes mais tempo criando camadas de imagem para cada montagem.
Tradução de um site ASP.NET real no Docker com testes!
Posso transferir meu site com podcasts para o Docker e também compilar / testar / executá-lo no Raspberry Pi? Sim
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"]
Ótimo Agora eu posso executar o comando docker build. no Raspberry Pi. O dispositivo irá restaurar, testar e construir. Se o teste falhar, a construção do Docker falhará.
Veja bem, há uma seção adicional chamada "testrunner" e depois "test?". Esta seção não funciona. Ele define ENTRYPOINT, mas ninguém nunca o usa ... por enquanto. ENTRYPOINT é um início implícito se estiver na última linha do arquivo Docker. Isso é feito para que eu possa encontrá-lo, se quiser.
Eu posso apenas construir e rodar assim:
docker build -t podcast . docker run --rm -it -p 8000:80 podcast
Nota Observe que a imagem "runtime" é microsoft / dotnet: 2.1-aspnetcore-runtime, não microsoft / dotnet: 2.1-runtime. Além disso, o aspnetcore one inclui anteriormente o código binário necessário para executar o aplicativo ASP.NET, para que eu possa incluir apenas um link para "/>" no csproj. Se você não usou a imagem base do aspnetcore-runtime, teria que ativar manualmente todos os pacotes do ASP.NET Core necessários. O uso de uma imagem básica pode aumentar os arquivos de imagem final, mas esse é apenas um equilíbrio entre conveniência e tamanho. Depende de você. Você pode ativar manualmente apenas os pacotes necessários ou usar o meta-pacote "Microsoft.AspNetCore.App" por conveniência. Minha imagem final de podcast pesava 205 megabytes, o que não é ruim, mas, é claro, se eu quisesse, poderia reduzi-la de várias maneiras.
E se eu apenas precisar
dos resultados
dos testes do Docker , posso obtê-los! Isso significa que eu posso executar o teste no contêiner do Docker, montar o volume entre o contêiner do Linux e o host (teórico) do Windows e abrir o arquivo .trx resultante no Visual Studio!
docker build --pull --target testrunner -t podcast:test . docker run --rm -v D:\github\hanselminutes-core\TestResults:/app/hanselminutes.core.tests/TestResults podcast:test
Apenas olhe! Estes são os resultados dos testes realizados em um contêiner Linux:

Aqui está o resultado. Agora eu tenho um site de podcast em execução no Docker no ARM32 Raspberry Pi 3 e levei apenas uma hora para trabalhar (escrevendo um arquivo do Docker)!
O segundo caminho. Você chegou a esse ponto? Você pode simplesmente instalar o .NET Core 2.1 SDK no hardware. O Docker não é necessário, basta baixar o tar.gz e configurá-lo. Eu posso instalá-lo em um
dispositivo como o RPI ARM32v7 Dockerfile . Observe que, ao fazer isso, eu tenho um tempo de execução comum do ASP.NET Core * e * .NET Core SDK. Na versão final, você receberá um SDK que incluirá tudo, incluindo o ASP.NET.
$ sudo apt-get -y update $ sudo apt-get -y install libunwind8 gettext $ wget https:
Viva a plataforma cruzada!