1. Introdução
Resolvendo uma tarefa bastante elementar e não tendo dominado as condições de desenvolvimento espartano para o ESP8266, decidi voltar ao aconchegante mundo .Net no qual há a conclusão automática e a depuração.
Então, temos em mãos:
- Um computador com Windows 10 Pro Build 1803 (no entanto, quase tudo que é escrito abaixo pode ser feito no * nix com alterações mínimas)
- Orange Pi Zero com o servidor Raspbian instalado
- O desejo de escrever código em C # e depurar no dispositivo pressionando F5 
Preparação do ambiente
Computador do desenvolvedor
O desenvolvimento será conduzido no Visual Studio Code com a extensão C# instalada.
É necessário um .NET Core SDK instalado.
Também é aconselhável ter uma versão do Windows 10 1803 , pois o OpenSSH é instalado por padrão nele. Nas versões anteriores do Windows 10, o OpenSSH pode ser instalado por meio de Gerenciar Complementos. No entanto, ao mesmo tempo, nada proíbe o uso de clientes SSH de terceiros.
Dispositivo alvo
Preparação
Primeiro de tudo, você precisa configurar o acesso à chave SSH. A excelente instrução da Digital Ocean ajuda perfeitamente com isso.
* Nota:
As chaves privadas podem ser armazenadas como arquivos separados na pasta .ssh, mas eu recomendo usar o grupo bastante conveniente do KeePass + KeeAgent . O KeePass fornece armazenamento seguro de chaves e o KeeAgent fornece chaves. Para que ele funcione com o cliente SSH do Windows interno, você deve ativar a configuração experimental correspondente. *
Instale o .NET Core SDK
Como o repositório oficial da Microsoft não contém pacotes compilados para o ARM32, você deve instalar o .NET Core SDK manualmente.
Primeiro de tudo, precisamos instalar as dependências listadas na documentação .
 apt-get install liblttng-ust0 libcurl3 libssl1.0.0 libkrb5-3 zlib1g libicu52 gettext 
Agora você pode instalar o SDK.
Você pode obter um link direto para o arquivo morto a partir do SDK na página SDK do GitHub .
 curl -sSL -o dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.401/dotnet-sdk-latest-linux-arm.tar.gz sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet sudo ln -s /opt/dotnet/dotnet /usr/local/bin 
Instalar depurador remoto
O script de instalação do depurador remoto usa unzip :
 sudo apt-get install unzip 
Para instalar o depurador remoto, execute o seguinte comando:
 curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -r linux-arm -v latest -l ~/vsdbg 
Configurando o VS Core para implantação remota e depuração no linux
1. Crie um projeto
Tudo é muito simples aqui:
 mkdir DemoProject cd DemoProject dotnet new console 
2. Crie arquivos de configuração
Abra a pasta com o projeto. A extensão C # baixará automaticamente os pacotes OmniSharp e .NET Core Debuger, se isso não tiver sido feito antes. Depois disso, seremos solicitados a criar ativos para criar e depurar o projeto. Nós concordamos com isso. Como resultado, a pasta .vscode com os launch.json e launch.json . Esses arquivos descrevem tarefas que você pode executar e configurações de inicialização. Por padrão, uma configuração de inicialização de depuração é criada, dependendo da tarefa de compilação.
3. Edite os arquivos de configuração
A idéia básica de iniciar e depurar em um dispositivo remoto é criar tarefas que coletam o projeto e copiam para o dispositivo e a configuração de inicialização usando o depurador remoto.
Vou dar uma descrição das tarefas concluídas:
 { "version": "2.0.0", "tasks": [ { "label": "publish", "command": "dotnet", "type": "process", "args": [ "publish", "${workspaceFolder}/DemoProject.csproj" ] }, { "label": "copy-to-device", "dependsOn": "publish", "command": "scp", "type": "process", "args": [ "-r", "-v", "${workspaceFolder}/bin/Debug/netcoreapp2.1/publish/.", "<target_user>@<target_ip>:~/DemoProject/" ] }, ] } 
A tarefa de publish chama o comando de dotnet publish , que empacota o aplicativo e suas dependências em uma pasta para implantação.
O comando copy-to-device usa scp para copiar o aplicativo publicado para o dispositivo remoto. Preste atenção ao ponto no final do caminho a partir do qual a cópia ocorre. Se você não especificar, nas cópias subseqüentes, a pasta de publish será colocada no DemoProject e não a substituirá. O parâmetro dependsOn indica que a copy-to-device depende da publish . Portanto, antes de executar a copy-to-device publish será executada.
Em seguida, você precisa definir a configuração remota de início e depuração:
 { "version": "0.2.0", "configurations": [ { "name": ".NET Core Launch (console)", "type": "coreclr", "request": "launch", "preLaunchTask": "copy-to-device", "program": "~/DemoProject/DemoProject.dll", "args": [], "cwd": "~/DemoProject", "console": "internalConsole", "stopAtEntry": false, "internalConsoleOptions": "openOnSessionStart", "pipeTransport": { "pipeCwd": "${workspaceRoot}", "pipeProgram": "ssh", "pipeArgs": [ "-T", "<target_user>@<target_ip>" ], "debuggerPath": "~/vsdbg/vsdbg", "quoteArgs": true } } ,] } 
O "preLaunchTask": "copy-to-device" indica que você deve concluir a tarefa de copy-to-device antes de iniciar uma sessão de depuração. Portanto, sempre que antes da depuração, o projeto será publicado e copiado no dispositivo de destino.
O parâmetro pipeTransport permite configurar o uso de um depurador remoto. Nesse caso, o ssh usado como o programa que fornece o transporte, mas nada impede o plink.exe do putty programas putty .
4. Depuração
Depois de pressionar F5, o projeto é criado, o projeto é copiado e o aplicativo é iniciado no dispositivo remoto. A depuração é completamente idêntica à local.
Nota: 
Após o término do aplicativo, sempre que eu recebia uma mensagem de Error from pipe program 'ssh': Process is terminating due to StackOverflowException . A julgar pelo problema aberto no GitHub, esse é um problema conhecido do depurador. Mas como o erro ocorre após a conclusão da depuração, você pode ignorar isso
Recursos utilizados
→ Configurando o Raspian e o .NET Core 2.0 em um Raspberry Pi
→ Depuração Remota Omnisharp-vscode no Linux Arm
→ ajuda do comando dotnet publish
→ Configurando o launch.json para depuração em C #
→ Código do Visual Studio Integre-se com Ferramentas Externas através de Tarefas