Apresentei no post anterior minhas aventuras com o porte do .NET nanoFramework para Linux e NuttX. Nesse artigo irei documentar como você pode executar aplicações .NET nanoFramework usando esse porte.

.NET nanoFramework Solution (Linux Mono)

Você pode usar qualquer solução criada pela extensão do .NET nanoFramework para Visual Studio. Infelizmente, não há ainda um template para o dotnet CLI (para ficar independente do VS 2019 por exemplo). Para esse caso, eu criei um exemplo que você pode clonar o repositório.

⚠️ Para os passos a seguir iremos usar comandos que fazem parte do Mono. Tenha certeza de ter instalado o pacote mais recente mono-complete em sua distro Linux.

Siga os passos com um terminal aberto:

1- Clone o repositório dos exemplos:

git clone https://github.com/dotnuttx/nanoFrameworkPOSIX-samples.git

2- Entre na pasta CSharpHelloWorld:

cd nanoFrameworkPOSIX-samples/CSharpHelloWorld

Para esse exemplo vamos compilar o seguinte Program.cs:

using System.Diagnostics;
using System.Threading;
using nanoFramework.Runtime.Native;

namespace CSharpHelloWorld
{
    public class Program
    {
        public static void Main()
        {
            Debug.WriteLine($"Hello from nanoFramework on {SystemInfo.OEMString}!");

            Thread.Sleep(Timeout.Infinite);
        }
    }
}

3- Faça download dos pacotes NuGet listados no packages.config, execute:

nuget restore

⚠️ A versão v2.6.4.6 do interpretador para Linux precisa exatamente da versão 1.10.5-preview.18 do pacote nanoFramework.CoreLibrary

4- Compile a solução, execute:

msbuild

Após a build você deverá ter os seguintes arquivos com extensão .pe na pasta bin/Debug/ do projeto:

ls -l bin/Debug/*.pe

-rw-r--r-- 1 castello castello   456 Jun 22 17:17 bin/Debug/CSharpHelloWorld.pe
-rwxr--r-- 1 castello castello 31668 Jun 19 07:25 bin/Debug/mscorlib.pe
-rwxr--r-- 1 castello castello  1496 Jun 19 07:46 bin/Debug/nanoFramework.Runtime.Native.pe

Esses são os Portable executables/assemblies que o interpretador do .NET nanoFramework sabe ler e executar. Se você tem eles listados na pasta bin/Debug/, parabéns 🎉 você compilou a aplicação com sucesso.

nanoFramework Runtime (Linux x86-64)

Você pode baixar binários pré-compilados do interpretador para Linux aqui: https://github.com/dotnuttx/nf-Community-Targets/releases

Para Linux arquitetura x86-64 temos dois sabores do binário:

⚠️ A versão .debug do binário é compilada com os debug symbols e com alguns trace by print habilitados. Ela será útil se você estiver trabalhando no desenvolvimento do interpretador.

Para instalar baixe o binário, adicione permissões de execução e mova para /usr/bin/:

wget https://github.com/dotnuttx/nf-Community-Targets/releases/download/v2.6.4.6/dotnet-nf.x86-64-Linux.2646
chmod +x dotnet-nf.x86-64-Linux.2646
sudo mv dotnet-nf.x86-64-Linux.2646 /usr/bin/dotnet-nf

Agora podemos enfim usar o runtime, para rodar nossa aplicação compilada nos primeiros passos. O binário recebe como argumento o caminho de uma pasta aonde irá carregar todos os arquivos .pe listados. Vá para a pasta CSharpHelloWorld/ do repositório do exemplo e execute:

dotnet-nf bin/Debug/

Se você tiver algo parecido com o seguinte output:

⚠️ A propriedade SystemInfo.OEMString em plataformas POSIX irá apresentar as mesmas informações do comando uname -a, provavelmente esse trecho estará diferente no seu Linux.

Parabéns 🎉! Você executou sua primeira aplicação .NET nanoFramework no Linux.

Conclusão

Ter o nanoFramework rodando em Linux é uma opção bacana para quem quer estudar o internals do nanoCLR fazer testes e debug usando o sistema do pinguim 🐧.

⚠️ Lembrando que isso é algo que estou trabalhando nos finais de semana e durante meu tempo livre. É algo EXTREMAMENTE EXPERIMENTAL e não estou sendo financiado por nenhum grupo ou instituição para tal.

Gostou da possibilidade? Se isso for de alguma forma útil, ou fizer sentido para você, deixe me saber. Me mande um alô no Twitter @math_castello ou no Linkedin 👍