System.Console,Mono和NCurses

大家好,在我的工作中(以及我学习的早期阶段),我经常使用C#,正如他们所说,这种语言已经让我很熟悉。 决定在编程方面进行一些练习之后,我为Linux编写了一个控制台文本编辑器。 我将简要描述获得的经验。

在Mono中,不完全支持System.Console类,但是Mono的独特之处在于,就像在.NET中一样,您可以使用P / Invoke来调用本机C / C ++ Linux库的方法。

就我而言,这是一个ncurses库。 看起来像这样:

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); } . . . 

如果System.Console无法正常工作,则可以根据需要连接此项目中的所有ncurses方法,但是如果标准方法可以工作,则将使工作变得更加轻松。

例如,ncurses wgetch()方法接收两个字节而不是一个Unicode字符,而对于西里尔字母布局,我将不得不使用一种更复杂的方法来传递指针。 使用标准的Console.ReadKey可以使所有代码易于管理,并可以轻松地将功能键与文本字符分开。

读写文件没有任何问题,一切都像在.NET上一样正常工作

图片

当一切稳定运行时,便尝试在Windows上构建此笔记本。 为了不从源头收集PDCurses,我从MinGW提取了现成的dll,即libpdcursesw.dll,它很好地替代了ncurses。

我什至不需要Mono来构建笔记本,我只是在Visual Studio中打开MonoDevelop解决方案而没有任何冒险。

唯一需要调整的是向控制台的输出,我不得不放弃mvwprintw,并且重写了Print,输出有效并且代码中的更改很小:

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

我还必须调整工作区的大小,以及更改文本颜色的方法。

所有这些使我确信C#非常适合Linux和该解决方案下的任务,在这种情况下,很容易移植到Windows。

完整的实现可在GitHub ,Linux的master分支和Windows的windows上获得。

Source: https://habr.com/ru/post/zh-CN468805/


All Articles