Разработка приложений на С# в Linux среде04.09.2007

Почти все знают, что .NET - платформа, разработанная компанией Microsoft, а эта корпорация ничего не делает задаром... Итак, язык C#. Хммм, странно, почему же он так напоминает Java? Ладно, проехали... Будем надеяться, что M$ заплатят за свои грехи. Но иногда даже заядлым линуксоидам приходиться программировать на этом языке. Не лезть же для этого в популярную проприетарную ОС? В этом случае нам на помощь приходит проект Mono. Вот, что про него пишут на официальном сайте:

То есть это тот набор утилит, что нам нужен. Собранные пакеты есть почти для всех популярных дистрибутивов Linux, либо сразу входят в набор дополнительного (но не установленного) софта. Итак, скачать Mono можно со странички http://www.mono-project.com/Downloads. Если готового пакета для нужного дистрибутива нет - то можно собрать Mono из исходного кода. Правда, компилируется он довольно долго.
После установки Mono мы уже можем успешно запускать .NET-приложения. Даже те, которые были написаны в Windows и имеют расширение .ехе. Но радоваться тут нечему - приложения "летают" со скоростью эмулятора. Хотя, под Windows скорость их работы примерно такая же :)
Разработчики Mono обещали нам также возможность разработки приложений. Но где же она? Mono - чисто консольное приложение и предназначено для запуска .NET программ. А возможность разработки заключается в том, что в комплект входит ещё и компилятор C#. Никакой удобной IDE для разработки в пакете нет. Это не понравится девелоперам, которые уже успели попользовать проприетарную Visual Studio. Но в Linux даже из безвыходных ситуаций всегда найдётся выход! :)
Удобная IDE для разработки С# приложений есть! И она называется MonoDevelop. Эта среда не входит в пакет Mono, так что качать и ставить её придётся отдельно. Скачать можно с официального сайта: http://www.monodevelop.com/Download. Надеюсь, с установкой у читателя проблем не возникнет.
Теперь создадим свой первый проект на С# под Linux. Для этого нужно запустить monodevelop. По медленной скорости загрузки этого приложения можно понять, что такое интерпретируемый язык... Эта среда так долго запускается только в первый раз. Во время этой загрузки она создаёт необходимые конфигурационные файлы, подготавливает систему к работе. В последующие разы IDE будет грузиться немного быстрее.


MonoDevelop: Главное окно

Итак, создадим новый проект. Это можно сделать либо кликнув по ссылке "Start a New Project" в окне приветствия, либо в меню "Файл" -> "Новый проект". По умолчанию выбран "Консольный проект". Так как это наше первое приложение - его и выбираем. В качестве названия я ввел "hello", название решения выставилось автоматически.


MonoDevelop: Создание проекта

После этого появится диалог "Project Features". Пока там можно ничего не выбирать (ну, или "Unix integration" наконец :) ). Кликаем "ОК" - и код минимального приложения создан :


MonoDevelop: Минимальное приложение

Допишем чуть-чуть кода, чтобы наше приложение еще и читало какие-нибудь данные из консоли и выводило ткуда что-то. Код заменим на:

[code=C#]  1 // Main.cs created with MonoDevelop
 2 // User: dxp at 20:25 Z03.09.2007
 3 //
 4 // To change standard headers go to Edit->Preferences->Coding->Standard Headers
 5 //
 6 // project created on 03.09.2007 at 20:25
 7 using System;
 8
 9 namespace hello
10 {
11
12     class Student{
13         
14         private string Name, Group;
15         private sbyte Age;
16         
17         public void AddToUniversity(string Name, string Group, sbyte Age)
18         {
19             this.Name = Name;
20             this.Group = Group;
21             this.Age = Age;
22         }
23         
24         public void Write()
25         {
26             Console.WriteLine("\nYour name is {0}\nYou in {1} group\nand your age is {2} :)",
27                                 this.Name, this.Group, this.Age);
28         }
29     }
30     
31     class MainClass
32     {
33         public static void Main(string[] args)
34         {
35             Console.WriteLine("Hello! What is your name?");
36             Student Me = new Student();
37             string par1 = Console.ReadLine();
38             Console.WriteLine("OK. How old are you?");
39             sbyte par2 = sbyte.Parse( Console.ReadLine() );  
40             Console.WriteLine("And what is your group?");
41             string par3 = Console.ReadLine();
42             Me.AddToUniversity(par1, par3, par2);
43             Me.Write();
44             Console.ReadKey();
45         }
46     }
47 }
[/code]
После этого сохраняем файл (тандартный хоткей Ctrl+S - рабочий) и компилируем программу. Это можно сделать либо при помощи меню "Проект" -> "Простроение hello" / "Построение решения", либо при помощи соответствующей кнопки на панели инструментов, либо ещё удобнее - по клавише F7. После этого в журнале построения должно появиться сообщение об успешной сборке.

Как видно, MonoDelvelop вполне функциональная и удобная среда. В ней уже можно с комфортом разрабатывать приложения. Порадовала относительно хорошая русская локализация - даже сообщения компилятора выводятся на русском языке. Большое количество настроек порадует любого девелопера. Также среда может помочь создать архив с новоразработанным приложением. Причём, сделать как версию с исходными кодами, так и с бинарными файлами. Отучают нас от консоли, балуют! :)
Ещё одной приятной фишкой среды было автодополнение функций. При введении символа "."(точка) после объекта какого-нибудь класса во всплывающем окошке отображаются все методы и свойства этого класса, будь то встроенный или только что написанный класс. Причём, можно использовать клавиши стрелок для навигации по этому списку и по каждой функции будет отображено краткое описание (если таковое имеется). Также можно продолжать вводить имя нужной функции с клавиатуры - тогда поиск в окне-подсказке будет совершён автоматически:


MonoDevelop: Вывод подсказки

В целом эта IDE оставляет приятные ощущения. И это не смотря на очень раннюю версию (0.15). Уже виднеются кроссплатформенные конкуренты Visual Studio от MS! :)
Но некоторые жизненно важные возможности пока не реализованы. Например, отладка. Если нужно написать небольшое приложение - то можно его написать и без отладки. Но писать серьёзные коммерческие приложения в этой среде пока будет трудновато. Остаётся лишь надеяться, что разработчики не заставят нас долго ждать и уже в ближайших версиях пошаговая отладка появится.

Теперь запустим нашу программу. Если сделать это при помощи кнопки "Запустить" (F5), то программа обругает нас, мол "Unhandled Exception: System.ArgumentNullException: Argument cannot be null..." Это происходит потому, что в поле "Возраст" мы должны были ввести число, а программа автоматически подставила значение null.
Чтоб ощутить, что мы написали реально рабочее приложение запустим его вручную. Для этого нужно перейти в каталог проекта. Потом в нем в каталог ./bin/Debug/. И в этом каталоге уже будет лежать наше готовое кроссплатформенное приложение. Можем запустить его при помощи mono и посмотреть результат:


MonoDevelop: Главное окно

Как видите, приложение работает :)
Теперь вернёмся к исходному коду. В нём показаны почти все основные принципы ООП:
- Инкапсуляция (скрытие полей объекта от других классов) - напрямую обращаться к свойствам объекта Me нельзя, компилятор выдаст ошибку. Для обращений к этим полям нужно использовать специальные доступные функции (API - Application Prorgramm Interface). Конкретно в данном примере это функции AddToUniversity и Write.
- Полиморфизм (возможность использования одинаковых имён). А именно, в функцию AddToUniversity передаются переменные, соответствующие классовым; вывод данных - функция Write.
- Наследование (в примере использовано не было).
В остальном исходный код должен быть понятен, так как приложеньице совсем маленькое. Однако даже маленькоее приложение может быть революционным шагом в истории! Ведь теперь для разработки приложений даже на C# вовсе не обязательно использовать Windows...


При написании данного материала были использованы:
- ОС : Gentoo Linux 2007.0
- Браузер : Mozilla Firefox 2.0.0.6
- Файловый менеджер : Midnight Commander 4.6.1 с набором патчей
- Эмулятор терминала : Konsole 1.6.6 (просвечивается картинка на рабочем столе)
- Текстовый редактор : GVim 7.1 (он же использовался для подсвечивания синтаксиса C# в материале)
- Графический редактор : Gimp 2.4.0
- Оконный менеджер : KDE 3.5.7
- Mono 1.2.4
- MonoDevelop 0.15

Комментарии

BY DeXPeriX ( http://dexperix.net ) 04.09.2007

DeXPeriX

P.S. За грамматику прошу простить - писалось ночью, руки ватные, мозгов и так мало. Причём, заметьте, в день когда нам прочитали первую лекцию по этому языку! (smile) Ибо был реальный мандраж - смогу ли девелопить в любимой оси, или придётся мастдай в эмуле ставить....

BY Ins 05.09.2007

У меня комментарий немного не в тему будет (wink) Честно признаюсь, что я не сильно хорошо разбираюсь в кроссплатформенном программировании, но немного разбираюсь в программировании вцелом. Вот эта фраза:

>> В нём показаны почти все основные принципы ООП:

Полиморфизм здесь тоже не показан. Полиморфизм строится именно на методах позднего связывания (виртуальных) и заключается в том, что перекрытый в потомке виртуальный метод заставляет объект вести себя по-другому, несмотря на то, что метод имеет то же имя. Полиморфизм невозможен без наследования, следовательно, в данном примере также не показан.

Классический пример полиморфизма (на Delphi)

type

TFigure = class

private

FName: String;

public

function GetName: String; virtual; abstract;

end;

TCircle = class(TFigure)

public

function GetName: String; override;

end;

TSquare = class(TFigure)

public

function GetName: String; override;

end;

...

function TCircle.GetName: String;

begin

Result:='Окружность';

end;

function TSquare.GetName: String;

begin

Result:='Квадрат';

end;

Одноименные методы разных классов выполняют различные действия, в результате чего родственные объекты ведут себя по-разному. Это и есть полиморфизм.

Оставить комментарий

Имя (ник):
( Ваш ник или реальное имя. Будет показано в заголовке комментария )
E-Mail:
( Ваш e-mail. Используется только для связи с Вами администрации. Показан НЕ будет )
Сайт, ICQ или Jabber:
( Это поле будет отображено в заголовке комментария рядом с Вашим именем )
Ваша оценка:
( Как Вы оцениваете данный материал? По умолчанию оценка не ставится )
Введите число, изображённое на картинке Image :
Текст комментария: