Primeiros passos com C# e o Mono #00

danroxha

Daniel Rocha

Posted on March 27, 2020

Primeiros passos com C# e o Mono #00
Capítulos
#00 - Instalação e compilador C#
#01 - Sistema de build e importação de pacotes
#02 - Configurando ambiente de desenvolvimento

Esse post é mais um lembrete. Comecei a escrever esse post porque queria salvar o passo a passo de como executar o C# em ambiente linux, utilizando a implementação open source do C#, o mono, sem utilizar qualquer IDE.

Porque não utilizar uma IDE ou algum editor de texto entupido de plugin (VS Code, ...) pra executar programas C#? Simplesmente porque gostaria de ter a dor de cabeça de rodar um programa em um ambiente pouco conhecido, sem saber muito da linguagem e sua importação de módulos, além de tentar entender como as IDEs "linkam" as bibliotecas com o arquivo raiz (Main).

Instalação do Mono:

Meu ambiente de atual é o Ubuntu 18.04, então os comandos de instalação são específicos pra essa plataforma, mas você pode acessar o site do projeto oficial para obter as instruções especificas pra sua plataforma clique aqui.

Adicionando o repositório.

sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
sudo apt update
Enter fullscreen mode Exit fullscreen mode

Comando de Instalação.

sudo apt install mono-devel
Enter fullscreen mode Exit fullscreen mode

+Como instalei o ".NET"

Tive alguns problemas na instalação do .NET. Ao Tentar adicionar o repositório da Microsoft o servidor não respondia ou demorava demais pra obter dados da internet. Pra passar por cima do problema da instalação convencional tive que usar o modo "avançado" que o pagina inicial do ".NET" disponibiliza. Selecionando a versão e a arquitetura, obtive o link de um script de instalação ".sh", ao executar o script, ele realizar a descompactação do pacote no diretório de chamada do script. Para deixar o comando "dotnet" disponível de forma global no sistema, movi o diretório do ".NET" para a /opt e fiz um link simbólico do executável principal para /usr/bin/.

Executando programas no Mono

Primeiramente uma simples observação: A documentação do MONO/MICROSOFT é dez vez mais detalhado do que esse passo a passo.

  • Arvore de diretórios:
.App
└── main.cs
Enter fullscreen mode Exit fullscreen mode
  • Conteúdo do main.css
using System;

namespace App {
    public class Run {
        public static void Main(string[] args) {
            Console.WriteLine("Hello Mono");
        }   
    }
}

Enter fullscreen mode Exit fullscreen mode
  • Compilando e executando.

O Mono possui o comando mono-csc que recebe N flags de configurações caso deseje uma compilação mais especifica. Para saber mais quais diretivas utilizar basta chamar o comando mono-csc --help | less, o | less serve para paginar o manual do comando.

mono-csc main.cs
Enter fullscreen mode Exit fullscreen mode

Após executar o comando, é gerado um arquivo com mesmo nome arquivo principal do projeto passado por parâmetro para o mono-csc com a extensão .exe. Caso exista erros no programa referente a sintaxe ou erro de importação a compilação falhará.

Para executar o arquivo gerado digite "./"(ponto + barra) na frente do programa compilado.

./main.exe
Enter fullscreen mode Exit fullscreen mode

Utilizando algumas flags do compilador Mono.

Todos as flags abaixo podem ser usadas em conjunto, e para facilitar a execução automatizada dos comandos recomendo utilizar o make e um Makefile.

Todas as flags

Definindo o arquivo principal do projeto (a que possui o Main).

mono-csc filename.cs -main:namespace.class
Enter fullscreen mode Exit fullscreen mode

Exemplo

mono-csc main.cs -main:App.Run
Enter fullscreen mode Exit fullscreen mode

Definindo um nome para o arquivo compilado

A flag -out: pode ser usada para definir um nome específico para o executável gerado, basta adicionar a flag e depois dos dois pontos (:) o nome do seu projeto.

mono-csc filename.cs -main:namespace.class -out:new_filename
Enter fullscreen mode Exit fullscreen mode

Exemplo

mono-csc main.cs -main:App.Run -out:hello_mono
Enter fullscreen mode Exit fullscreen mode

Compilando recursivamente.

A opção -recurse permite compilar arquivos de código-fonte em todos os diretórios filho do diretório especificado ou do diretório do projeto.
.

mono-csc -recurse:filename.cs -main:namespace.class -out:new_filename
Enter fullscreen mode Exit fullscreen mode

Exemplo

mono-csc -recurse:main.cs -main:App.Run -out:new_filename
Enter fullscreen mode Exit fullscreen mode

Compilando com dependência de class/namespaces externas

Vamos modificar um pouco o "projeto" para ter os múltiplos arquivos.

  • Arvore de diretórios:
.App
├── ClasseExterna
│   └── ClasseExterna.cs
├── main.cs
└── outraClasseExterna.cs
Enter fullscreen mode Exit fullscreen mode

Conteúdo dos arquivos

  • main.cs
using App.ClassExterna;
using App.OutraClassExterna;

namespace App {
    public class Run{
        public static void Main(string[] args){
            Falar.Diga("Ola Class Externa");
            Grite.Som("AHAHHAHAHHAHAHAHHAHAH");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode
  • outraClasseExterna.cs
using System;

namespace App.OutraClassExterna{
    public static class Grite{
        public static void Som(string msg){
            Console.WriteLine(msg);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode
  • ClasseExterna/ClasseExterna.cs.cs
using System;

namespace App.ClassExterna {
    public static class Falar{
        public static void Diga(string msg){
            Console.WriteLine(msg);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Compilando os arquivos

Para realizar a compilação dos multiplos arquivos, passe os arquivos como parâmetro, respeitando os locais dos arquivos.

mono-csc filename.cs pathname/filename1.cs pathname/filename2.cs
Enter fullscreen mode Exit fullscreen mode

Exemplo

mono-csc -recurse:main.cs ClasseExterna/*.cs outraClasseExterna.cs   
Enter fullscreen mode Exit fullscreen mode

Adicionando na compilação uma das bibliotecas padrão.

Vamos usar a System.Drawing e System.Windows.Forms como exemplo.

O nosso novo app vai apenas exibir na tela a mensagem: "Meu primeiro Programa em C# com GUI usando Mono".

  • Arvore de diretórios.
.App
├── main.cs
Enter fullscreen mode Exit fullscreen mode
  • Conteudo da main.cs
using System;
using System.Drawing;
using System.Windows.Forms;

namespace App {
    class Window : System.Windows.Forms.Form {

        public Window(){} 

        public Window(string title, int width, int height) {

            Label label = new Label();

            ClientSize = new System.Drawing.Size (width, height);

            label.Text = "Meu primeiro Programa em C# com GUI usando Mono";
            label.Dock = DockStyle.Fill;
            label.TextAlign = ContentAlignment.MiddleCenter;
            this.Controls.Add(label);
            Text = title;

        }

        public static void Main(string[] args) {

            int width = 840, height = 480;

            Application.Run(new Window("Minha Janela", width, height));
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Exemplo retirado do próprio repositório do Mono link do repositório

Compilando
  • Sintaxe
mono-csc filename.cs -r:library.dll -r:library.dll
Enter fullscreen mode Exit fullscreen mode

Exemplo
Como estamos utilizando a System.Drawing e System.Windows.Forms, devemos colocar essas bibliotecas como referencia na compilação com a flag -reference ou -r.

mono-csc main.cs -r:System.Windows.Forms.dll -r:System.Drawing.dll 
Enter fullscreen mode Exit fullscreen mode
Programa em execução.

Há bibliotecas que não necessitam ser referenciadas no momento da compilação, exemplo: System, System.Collections.Generics

Usando pacotes.

Vamos usar o Gtk como exemplo nesse tópico.

  • Fonte
using Gtk;

namespace Poem {
    public sealed class GoncalvesDias {
        public struct Lyrical{
            public string Title;
            public string Body;

            static Lyrical(){}

            public Lyrical(string title, string body){
                Title = title;
                Body = body;
            }
        }

        public static Lyrical SongOfExile =  new Lyrical(
            "Canção do Exílio", 

        @"
        Minha terra tem palmeiras,
        Onde canta o Sabiá;
        As aves, que aqui gorjeiam,
        Não gorjeiam como lá.

        Nosso céu tem mais estrelas,
        Nossas várzeas têm mais flores,
        Nossos bosques têm mais vida,
        Nossa vida mais amores.

        Em cismar, sozinho, à noite,
        Mais prazer encontro eu lá;
        Minha terra tem palmeiras,
        Onde canta o Sabiá.

        Minha terra tem primores,
        Que tais não encontro eu cá;
        Em cismar — sozinho, à noite —
        Mais prazer encontro eu lá;
        Minha terra tem palmeiras,
        Onde canta o Sabiá.

        Não permita Deus que eu morra,
        Sem que eu volte para lá;
        Sem que desfrute os primores
        Que não encontro por cá;
        Sem qu’inda aviste as palmeiras,
        Onde canta o Sabiá.

        By Gonçalves Dias."
        );

    }
}


namespace App{
    public class Screen : Window {   
        public Screen(string title) : base(title) {

BorderWidth = 8;
            SetPosition(WindowPosition.Center);
            DeleteEvent += delegate { Application.Quit(); };
        }
    }
}

namespace Root {
    public class Run {
        public static void Main(){
            Application.Init();
            var screen = new App.Screen(Poem.GoncalvesDias.SongOfExile.Title);

            var poem = new Label(Poem.GoncalvesDias.SongOfExile.Body);

            screen.Add(poem);
            screen.ShowAll();

            Application.Run();
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Para realizar a compilação utilizando um pacote, o compilador do Mono possui a flag -pkg: passando depois dos dois pontos o pacote utilizado no projeto.

mono-csc filename.cs -pkg:package 
Enter fullscreen mode Exit fullscreen mode

Exemplo

mono-csc main.cs -pkg:gtk-sharp-2.0 
Enter fullscreen mode Exit fullscreen mode
Programa em execução.

Como sei quais pacotes estão disponíveis no meu sistema?

  • Verifique o diretório /usr/lib/mono
💖 💪 🙅 🚩
danroxha
Daniel Rocha

Posted on March 27, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related