System.Console, Mono e NCurses

Olá a todos, no meu trabalho (e no início dos meus estudos) eu costumo usar C # e essa linguagem se tornou familiar para mim, como eles dizem. Tendo decidido praticar um pouco de programação, escrevi um editor de texto de console para Linux. Descreverei brevemente a experiência adquirida.

No Mono, a classe System.Console não é totalmente suportada, mas o Mono é notável, pois, como no .NET, você pode usar o P / Invoke para chamar métodos de bibliotecas Linux nativas C / C ++.

No meu caso, era uma biblioteca ncurses. É assim:

public class Curses { /// <summary> ///    /// </summary> const string NCurses = "libncursesw.so.5"; /// <summary> ///     /// </summary> private IntPtr window; [DllImport(NCurses)] private extern static IntPtr initscr(); /// <summary> ///    /// </summary> public Curses() { window = initscr(); } [DllImport(NCurses)] private extern static int endwin(); /// <summary> ///   /// </summary> ~Curses() { int result = endwin(); } [DllImport(NCurses)] private extern static int mvwprintw(IntPtr window, int y, int x, string message); /// <summary> ///     /// </summary> public int Print(int x, int y, string message) { return mvwprintw(window, y, x, message); } [DllImport(NCurses)] private extern static int refresh(IntPtr window); /// <summary> ///    /// </summary> public int Refresh() { return refresh(window); } . . . 

Todos os métodos ncurses deste projeto foram conectados conforme necessário, caso o System.Console não funcionasse corretamente, mas se o método padrão funcionasse, tornaria a vida muito mais fácil.

Por exemplo, o método ncurses wgetch () recebe dois bytes em vez de um para caracteres Unicode e, para o layout cirílico, eu precisaria usar um método mais complexo para passar o ponteiro. O uso do Console.ReadKey padrão permitiu deixar todo o código gerenciável e separar facilmente as teclas de função dos caracteres de texto.

Não houve problemas com a leitura e gravação de arquivos e tudo funcionou corretamente como no .NET

imagem

Quando tudo estava funcionando de forma estável, foi feita uma tentativa de criar esse notebook no Windows. Para não coletar PDCurses das fontes, peguei uma dll pronta do MinGW, a saber libpdcursesw.dll, e ele fez um bom trabalho como substituto das ncurses.

Eu nem precisava do Mono para criar um notebook, apenas abri a solução MonoDevelop no Visual Studio sem aventuras.

A única coisa que exigiu ajustes foi a saída para o console, tive que abandonar o mvwprintw e reescrevi o Print, a saída funcionou e as alterações no código foram mínimas:

 public void Print(int x, int y, string message) { Console.SetCursorPosition(x, y); Console.Write(message); } 

Eu também tive que ajustar o tamanho da área de trabalho e métodos para alterar a cor do texto.

Tudo isso me convenceu de que o C # é bastante adequado para tarefas no Linux e na solução; nesse caso, é fácil portar para o Windows.

A implementação completa está disponível no GitHub , o ramo principal do Linux e o Windows para Windows.

Source: https://habr.com/ru/post/pt468805/


All Articles