Программирование на .NET в Linux
Часть 2. Первое приложение на Mono C#
Перейдем от теории к практике. Во-первых, нам нужна сама платформа mono (11 января 2006 г. вышла версия 1.1.13, скачать ее можно здесь: сайт ). Во-вторых, ее нужно установить. Если вы не являетесь счастливым обладателем SuSE Linux, куда входит стабильная и настроенная версия Mono, то установка будет не совсем тривиальной. Но обо всем по порядку.
Бинарный инсталлятор нужно запускать, разумеется, под аккаунтом суперпользователя. Установщик оснащен графическим интерфейсом, так что процесс распаковки Mono в каталог /opt вопросов не вызовет. Проблемы могут начаться сразу, как только захотите запустить, к примеру, monodevelop. Оказывается, установочный скрипт Mono не всегда знает, куда прописать экспорт переменных окружения. Но подсказку кое-какую все же дает: в каталоге /root в файле .profile будут следующие строчки:
export PATH="/opt/mono-1.1.13/bin:$PATH"
export PKG_CONFIG_PATH="/opt/mono-1.1.13/lib/pkgconfig:$PKG_CONFIG_PATH"
export MANPATH="/opt/mono-1.1.13/share/man:$MANPATH"
export LD_LIBRARY_PATH="/opt/mono-1.1.13/lib:$LD_LIBRARY_PATH"
Их-то и нужно прописать в файл конфигурации консоли. В моем случае это был .bashrc. После этой магической операции Mono будет работать без проблем. Чтобы также без проблем запускались и ее графические инструменты, как-то: monodevelop или monodoc, должны быть установлены соответствующие библиотеки GNOME. Установка Mono на платформу Windows происходит аналогичным образом за исключением последнего пункта: все графические библиотеки, к которым есть привязки, поставляются прямо с инсталятором. Посмотрим, какие инструменты Mono могут нам понадобиться в работе:
1. mcs — Mono C# компилятор.
2. mbas — Mono Basic компилятор.
3. mono — команда, которая запускает на выполнение .NET-приложение в виртуальной машине Mono.
4. xsp — Mono ASP.NET Web Server. Это, конечно же, не полноценный web-сервер, как Apache, а просто удобная утилита для тестирования ASP.NET- кода. Она очень проста в использовании. А готовые ASP.NET-страницы, естественно, нужно хостить под Apache'м при помощи специального модуля mod_mono для этого сервера.
5. monodoc — справочник по Mono (рис. 1). В использовании очень похож на аналогичный, поставляемый с MS.NET Framework SDK. Содержит документацию на API, которые входят в Mono, а также спецификацию языка C#. Просматривая страницы monodoc, нужно учитывать важный момент: Mono так бурно развивается, что зачастую документация немного отстает от самой платформы. По всей видимости, технические писатели просто не успевают вносить дополнения в справочник, а они (дополнения) случаются часто и много.
Рис. 1. Справочник monodoc
6. monop — просмотрщик сигнатур Mono. Нужен в тех случаях, когда на некоторую сборку Mono нет документации. Тогда при помощи monop можно посмотреть, из чего она состоит. Пример: $ monop System.Int32
[Serializable]
public struct Int32 : IComparable, IConvertible, IFormattable {
public static int Parse (string s);
public static int Parse (string s, IFormatProvider fp);
...
public const int MaxValue = 2147483647;
public const int MinValue = -2147483648;
}
7. gacutil — утилита для управления библиотеками Mono. В Mono есть так называемый Global Assembly Cache (GAC), в котором и регистрируются все сборки при помощи этой утилиты. Чтобы посмотреть, какие библиотеки уже установлены, введите команду gacutil -l.
8. mdb — Mono Debugger. В официальных релизах Monodevelop его пока не включают. Тем не менее, дебагер вполне можно использовать из командной строки на манер gdb.
9. monodevelop — интегрированная среда разработки (IDE) для Mono.
Любопытные могут заметить, что в каталогах bin и lib некоторые файлы дублируются с суффиксом "2". Конечно же, это связано с .NET 2.0, которая даже у Microsoft вышла не так давно. Что касается Mono, то поддержка .NET 2.0 пока только частичная, и сделано еще не все.
Еще один интересный момент: перечисленные выше приложения являются .NET-приложениями и имеют расширение .exe. Но в каталоге bin лежат лишь скрипты-обертки без расширений, которые и запускают в среде Mono соответствующие программы. Это сделано для того, чтобы не раздражать ортодоксальных пользователей UNIX, которым неприятен любой намек на MS Windows, даже если это просто расширение программ. Приступая к написанию программ, каждый первым делом задумывается о том, какой редактор кода использовать. Mono поставляется с очень приличной IDE MonoDevelop. Впрочем, часто бывает, что именно редактор кода является предметом религиозного поклонения UNIX-программистов. Чтобы писать приложения Mono, совсем не обязательно отказываться от старых привычек и пользоваться MonoDevelop'ом. Все-таки многие уже привыкли к ViM'у, Emacs'у или даже KDevelop'у и не хотели бы по новой изучать инструменты редактирования. Наше первое приложение будет написано без помощи MonoDevelop, тем более, что это достаточно просто. Вот текст классического HelloWorld'а:
// File: main.cs
using System;
public class First
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
Чтобы скомпилировать этот пример, нужно воспользоваться утилитой mcs:
$mcs main.cs
В результате получится файл main.exe. Запускать его нужно при помощи утилиты mono:
$mono main.exe
Hello, World!
Те, кто знаком с программированием под UNIX, сразу заметят, что к работе было бы очень удобно подключить утилиту make. Для примера приведу такой Makefile:
all:
rm *.exe
mcs main.cs
echo "Running..."
mono main.exe
Теперь при помощи одной команды make приложение автоматически построится и запустится. Разумеется, при использовании IDE эти задачи автоматизируются. При этом использовать MonoDevelop значительно проще, чем классические редакторы кода или даже полноценные IDE вроде KDevelop. При использовании MonoDevelop автоматизируется еще одна рутинная задача: линковка библиотек. Например, для создания оконного приложения с использованием Gtk нужно было бы при компиляции указать ключ "-r:gtk-sharp.dll". И так для каждой подключаемой сборки. Немудрено наделать ошибок, да и время это отнимает. А с MonoDevelop все значительно проще: нужно только поставить галочку в списке известных сборок (рис. 2).
Рис. 2. Редактор ссылок
Однако, несмотря на всю простоту программирования для платформы Mono, никто не отменял все принципы UNIX. В частности, важно, чтобы программа возвращала правильное значение при выходе, т.к. она может быть использована в скрипте или конвейере. Сделать это можно при помощи класса System.Environment.
Пример: System.Environment.Exit(0);
Аналогичным образом можно получить значения переменных окружения:
System.Environment.GetEnvironmentVariable("PATH");
С помощью все того же System.Environment также можно получить версию операционной системы, под которой запущена программа. Его свойство OSVersion вернет значение 128 для UNIX-платформ. Остальные значения приходятся на различные версии MS Windows.
Дмитрий Бушенко, nop@list.ru
Перейдем от теории к практике. Во-первых, нам нужна сама платформа mono (11 января 2006 г. вышла версия 1.1.13, скачать ее можно здесь: сайт ). Во-вторых, ее нужно установить. Если вы не являетесь счастливым обладателем SuSE Linux, куда входит стабильная и настроенная версия Mono, то установка будет не совсем тривиальной. Но обо всем по порядку.
Бинарный инсталлятор нужно запускать, разумеется, под аккаунтом суперпользователя. Установщик оснащен графическим интерфейсом, так что процесс распаковки Mono в каталог /opt вопросов не вызовет. Проблемы могут начаться сразу, как только захотите запустить, к примеру, monodevelop. Оказывается, установочный скрипт Mono не всегда знает, куда прописать экспорт переменных окружения. Но подсказку кое-какую все же дает: в каталоге /root в файле .profile будут следующие строчки:
export PATH="/opt/mono-1.1.13/bin:$PATH"
export PKG_CONFIG_PATH="/opt/mono-1.1.13/lib/pkgconfig:$PKG_CONFIG_PATH"
export MANPATH="/opt/mono-1.1.13/share/man:$MANPATH"
export LD_LIBRARY_PATH="/opt/mono-1.1.13/lib:$LD_LIBRARY_PATH"
Их-то и нужно прописать в файл конфигурации консоли. В моем случае это был .bashrc. После этой магической операции Mono будет работать без проблем. Чтобы также без проблем запускались и ее графические инструменты, как-то: monodevelop или monodoc, должны быть установлены соответствующие библиотеки GNOME. Установка Mono на платформу Windows происходит аналогичным образом за исключением последнего пункта: все графические библиотеки, к которым есть привязки, поставляются прямо с инсталятором. Посмотрим, какие инструменты Mono могут нам понадобиться в работе:
1. mcs — Mono C# компилятор.
2. mbas — Mono Basic компилятор.
3. mono — команда, которая запускает на выполнение .NET-приложение в виртуальной машине Mono.
4. xsp — Mono ASP.NET Web Server. Это, конечно же, не полноценный web-сервер, как Apache, а просто удобная утилита для тестирования ASP.NET- кода. Она очень проста в использовании. А готовые ASP.NET-страницы, естественно, нужно хостить под Apache'м при помощи специального модуля mod_mono для этого сервера.
5. monodoc — справочник по Mono (рис. 1). В использовании очень похож на аналогичный, поставляемый с MS.NET Framework SDK. Содержит документацию на API, которые входят в Mono, а также спецификацию языка C#. Просматривая страницы monodoc, нужно учитывать важный момент: Mono так бурно развивается, что зачастую документация немного отстает от самой платформы. По всей видимости, технические писатели просто не успевают вносить дополнения в справочник, а они (дополнения) случаются часто и много.
Рис. 1. Справочник monodoc
6. monop — просмотрщик сигнатур Mono. Нужен в тех случаях, когда на некоторую сборку Mono нет документации. Тогда при помощи monop можно посмотреть, из чего она состоит. Пример: $ monop System.Int32
[Serializable]
public struct Int32 : IComparable, IConvertible, IFormattable {
public static int Parse (string s);
public static int Parse (string s, IFormatProvider fp);
...
public const int MaxValue = 2147483647;
public const int MinValue = -2147483648;
}
7. gacutil — утилита для управления библиотеками Mono. В Mono есть так называемый Global Assembly Cache (GAC), в котором и регистрируются все сборки при помощи этой утилиты. Чтобы посмотреть, какие библиотеки уже установлены, введите команду gacutil -l.
8. mdb — Mono Debugger. В официальных релизах Monodevelop его пока не включают. Тем не менее, дебагер вполне можно использовать из командной строки на манер gdb.
9. monodevelop — интегрированная среда разработки (IDE) для Mono.
Любопытные могут заметить, что в каталогах bin и lib некоторые файлы дублируются с суффиксом "2". Конечно же, это связано с .NET 2.0, которая даже у Microsoft вышла не так давно. Что касается Mono, то поддержка .NET 2.0 пока только частичная, и сделано еще не все.
Еще один интересный момент: перечисленные выше приложения являются .NET-приложениями и имеют расширение .exe. Но в каталоге bin лежат лишь скрипты-обертки без расширений, которые и запускают в среде Mono соответствующие программы. Это сделано для того, чтобы не раздражать ортодоксальных пользователей UNIX, которым неприятен любой намек на MS Windows, даже если это просто расширение программ. Приступая к написанию программ, каждый первым делом задумывается о том, какой редактор кода использовать. Mono поставляется с очень приличной IDE MonoDevelop. Впрочем, часто бывает, что именно редактор кода является предметом религиозного поклонения UNIX-программистов. Чтобы писать приложения Mono, совсем не обязательно отказываться от старых привычек и пользоваться MonoDevelop'ом. Все-таки многие уже привыкли к ViM'у, Emacs'у или даже KDevelop'у и не хотели бы по новой изучать инструменты редактирования. Наше первое приложение будет написано без помощи MonoDevelop, тем более, что это достаточно просто. Вот текст классического HelloWorld'а:
// File: main.cs
using System;
public class First
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
Чтобы скомпилировать этот пример, нужно воспользоваться утилитой mcs:
$mcs main.cs
В результате получится файл main.exe. Запускать его нужно при помощи утилиты mono:
$mono main.exe
Hello, World!
Те, кто знаком с программированием под UNIX, сразу заметят, что к работе было бы очень удобно подключить утилиту make. Для примера приведу такой Makefile:
all:
rm *.exe
mcs main.cs
echo "Running..."
mono main.exe
Теперь при помощи одной команды make приложение автоматически построится и запустится. Разумеется, при использовании IDE эти задачи автоматизируются. При этом использовать MonoDevelop значительно проще, чем классические редакторы кода или даже полноценные IDE вроде KDevelop. При использовании MonoDevelop автоматизируется еще одна рутинная задача: линковка библиотек. Например, для создания оконного приложения с использованием Gtk нужно было бы при компиляции указать ключ "-r:gtk-sharp.dll". И так для каждой подключаемой сборки. Немудрено наделать ошибок, да и время это отнимает. А с MonoDevelop все значительно проще: нужно только поставить галочку в списке известных сборок (рис. 2).
Рис. 2. Редактор ссылок
Однако, несмотря на всю простоту программирования для платформы Mono, никто не отменял все принципы UNIX. В частности, важно, чтобы программа возвращала правильное значение при выходе, т.к. она может быть использована в скрипте или конвейере. Сделать это можно при помощи класса System.Environment.
Пример: System.Environment.Exit(0);
Аналогичным образом можно получить значения переменных окружения:
System.Environment.GetEnvironmentVariable("PATH");
С помощью все того же System.Environment также можно получить версию операционной системы, под которой запущена программа. Его свойство OSVersion вернет значение 128 для UNIX-платформ. Остальные значения приходятся на различные версии MS Windows.
Дмитрий Бушенко, nop@list.ru
Компьютерная газета. Статья была опубликована в номере 04 за 2006 год в рубрике программирование