Разработка приложений на С# в Linux среде
Почти все знают, что .NET - платформа, разработанная компанией Microsoft, а эта корпорация ничего не делает задаром... Итак, язык C#. Хммм, странно, почему же он так напоминает Java? Ладно, проехали... Будем надеяться, что M$ заплатят за свои грехи. Но иногда даже заядлым линуксоидам приходиться программировать на этом языке. Не лезть же для этого в популярную проприетарную ОС? В этом случае нам на помощь приходит проект Mono. Вот, что про него пишут на официальном сайте:
- Mono provides the necessary software to develop and run .NET client and server applications on Linux, Solaris, Mac OS X, Windows, and Unix.
После установки Mono мы уже можем успешно запускать .NET-приложения. Даже те, которые были написаны в Windows и имеют расширение .ехе. Но радоваться тут нечему - приложения "летают" со скоростью эмулятора. Хотя, под Windows скорость их работы примерно такая же
Разработчики Mono обещали нам также возможность разработки приложений. Но где же она? Mono - чисто консольное приложение и предназначено для запуска .NET программ. А возможность разработки заключается в том, что в комплект входит ещё и компилятор C#. Никакой удобной IDE для разработки в пакете нет. Это не понравится девелоперам, которые уже успели попользовать проприетарную Visual Studio. Но в Linux даже из безвыходных ситуаций всегда найдётся выход!
Удобная IDE для разработки С# приложений есть! И она называется MonoDevelop. Эта среда не входит в пакет Mono, так что качать и ставить её придётся отдельно. Скачать можно с официального сайта: http://www.monodevelop.com/Download. Надеюсь, с установкой у читателя проблем не возникнет.
Теперь создадим свой первый проект на С# под Linux. Для этого нужно запустить monodevelop. По медленной скорости загрузки этого приложения можно понять, что такое интерпретируемый язык... Эта среда так долго запускается только в первый раз. Во время этой загрузки она создаёт необходимые конфигурационные файлы, подготавливает систему к работе. В последующие разы IDE будет грузиться немного быстрее.
Итак, создадим новый проект. Это можно сделать либо кликнув по ссылке "Start a New Project" в окне приветствия, либо в меню "Файл" -> "Новый проект". По умолчанию выбран "Консольный проект". Так как это наше первое приложение - его и выбираем. В качестве названия я ввел "hello", название решения выставилось автоматически.
После этого появится диалог "Project Features". Пока там можно ничего не выбирать (ну, или "Unix integration" наконец ). Кликаем "ОК" - и код минимального приложения создан :
Допишем чуть-чуть кода, чтобы наше приложение еще и читало какие-нибудь данные из консоли и выводило ткуда что-то. Код заменим на:
[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 вполне функциональная и удобная среда. В ней уже можно с комфортом разрабатывать приложения. Порадовала относительно хорошая русская локализация - даже сообщения компилятора выводятся на русском языке. Большое количество настроек порадует любого девелопера. Также среда может помочь создать архив с новоразработанным приложением. Причём, сделать как версию с исходными кодами, так и с бинарными файлами. Отучают нас от консоли, балуют!
Ещё одной приятной фишкой среды было автодополнение функций. При введении символа "."(точка) после объекта какого-нибудь класса во всплывающем окошке отображаются все методы и свойства этого класса, будь то встроенный или только что написанный класс. Причём, можно использовать клавиши стрелок для навигации по этому списку и по каждой функции будет отображено краткое описание (если таковое имеется). Также можно продолжать вводить имя нужной функции с клавиатуры - тогда поиск в окне-подсказке будет совершён автоматически:
В целом эта IDE оставляет приятные ощущения. И это не смотря на очень раннюю версию (0.15). Уже виднеются кроссплатформенные конкуренты Visual Studio от MS!
Но некоторые жизненно важные возможности пока не реализованы. Например, отладка. Если нужно написать небольшое приложение - то можно его написать и без отладки. Но писать серьёзные коммерческие приложения в этой среде пока будет трудновато. Остаётся лишь надеяться, что разработчики не заставят нас долго ждать и уже в ближайших версиях пошаговая отладка появится.
Теперь запустим нашу программу. Если сделать это при помощи кнопки "Запустить" (F5), то программа обругает нас, мол "Unhandled Exception: System.ArgumentNullException: Argument cannot be null..." Это происходит потому, что в поле "Возраст" мы должны были ввести число, а программа автоматически подставила значение null.
Чтоб ощутить, что мы написали реально рабочее приложение запустим его вручную. Для этого нужно перейти в каталог проекта. Потом в нем в каталог ./bin/Debug/. И в этом каталоге уже будет лежать наше готовое кроссплатформенное приложение. Можем запустить его при помощи mono и посмотреть результат:
Как видите, приложение работает
Теперь вернёмся к исходному коду. В нём показаны почти все основные принципы ООП:
- Инкапсуляция (скрытие полей объекта от других классов) - напрямую обращаться к свойствам объекта 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
Комментарии
DeXPeriX ( http://dexperix.net )
04.09.2007P.S. За грамматику прошу простить - писалось ночью, руки ватные, мозгов и так мало. Причём, заметьте, в день когда нам прочитали первую лекцию по этому языку! Ибо был реальный мандраж - смогу ли девелопить в любимой оси, или придётся мастдай в эмуле ставить....
Ins
05.09.2007У меня комментарий немного не в тему будет Честно признаюсь, что я не сильно хорошо разбираюсь в кроссплатформенном программировании, но немного разбираюсь в программировании вцелом. Вот эта фраза:
>> В нём показаны почти все основные принципы ООП:
Полиморфизм здесь тоже не показан. Полиморфизм строится именно на методах позднего связывания (виртуальных) и заключается в том, что перекрытый в потомке виртуальный метод заставляет объект вести себя по-другому, несмотря на то, что метод имеет то же имя. Полиморфизм невозможен без наследования, следовательно, в данном примере также не показан.
Классический пример полиморфизма (на 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;
Одноименные методы разных классов выполняют различные действия, в результате чего родственные объекты ведут себя по-разному. Это и есть полиморфизм.