Как запустить mono приложение linux

Обновлено: 06.07.2024

aptitude install sudo

Все, теперь все операции через sudo. У меня на сервере стоит Debian, поэтому все, что далее написано, применимо к любому дистрибутиву Linux, основанному на Debian, в том числе и к большинству дистрибутивов, основанных на Ubuntu.

Итак, если вы используете Debian, то на первый взляд тут все довольно печально – самой старшей версией, доступной в стандартном репозитории стабильной ветки, является Mono 1.9.1. Идем на сайт Mono. Слегка порывшись в документации можно увидеть, что все-таки существует возможность поставить версию 2.4.2.3. Для этого нужно добавить репозиторий в файл /etc/apt/sources.list:

Обновить список пакетов и произвести установку:

sudo aptitude update
sudo aptitude -t lenny-backports install mono-runtime

В репозитории Ubuntu последних версий, версия 2.4.2.3 доступна, поэтому если нужна эта версия, ее можно установить так:

sudo aptitude install mono-runtime

Установка Mono 2.6

Для установки Mono 2.6.1 нужно добавить в файл /etc/apt/sources.list два репозитория – тестируемых пакетов Debian, для получения свежих версий некоторых пакетов, и репозиторий OpenSuse. Во втором находятся несколько версий Mono 2.6.1 и можно выбрать нужную версию. Так как конкретно для Debian там был только пакет libgdiplus, я добавил репозиторий для Ubuntu 9.10:

Обновляем список пакетов и устанавливаем Mono:

sudo aptutude update
sudo aptitude install mono-runtime

Итак, минимальная конфигурация Mono установлена. Проверить, что установилась именно Mono версии 2.6.1, можно, набрав команду:

Теперь можно доустановить другие нужные пакеты Mono или оставить все как есть.

Настройка nginx в качестве front-end к xsp2.

Итак, процесс установки nginx в качестве front-end сервера к xsp2, заключается в следующем.

Установка и настройка nginx:

Установка xsp2

При желании можно сконфигурировать автозапуск веб-сервера xsp2. Сделать это очень просто, например, через .webapp-файл, который имеет следующий формат

Тегов web-application может быть несколько, по одному на каждое Web-приложение.

Конфигурационной директорией, указанной в стандартном скрипте для автозапуска, является /etc/xsp2/. В ней находится файл debian.webapp, используемый в качестве конфигурационного по умолчанию. Можно внести измения прямо в него. Например, для запуска Web-приложения, используемого выше для проверки работоспособности сервера, изменения выглядят так:

Также, нужно убрать опцию --port $post из скрипта автозапуска, в противном случае указанные в конфигурационном .webapp-файле порты будут проигнорированы.

Теперь нужно проверить работоспособность. Распакуйте и поместите тестовые файлы в папку /var/www/myvps. Запустите nginx и xsp2:

Работаем с Mono. Часть 1: Основные принципы Mono, инструменты, создание простейшего приложения

В базовом варианте Mono состоит из нескольких компонентов:

Описание основных компонентов и возможностей Mono

Начиная с версии Mono 2.2 реализована поддержка классов компилятора Mono.CSharp.Evaluator (сборка Mono.Sharp.dll) для создания собственных сервисов компиляции.

Среда исполнения Mono поддерживает инфраструктуру промежуточного языка CLI (Common Language Infrastructure), соответствующую стандарту ECMA-335. Виртуальная машина среды исполнения допускает возможность запуска приложений и сборок, скомпилированных в других системах (например, возможно запускать в Linux без перекомпиляции приложения, созданные при помощи Microsoft Visual Studio для исполнения в Microsoft Windows).

Также, вместо использования виртуальной машины, среда исполнения может быть интегрирована в приложение с целью создания встраиваемой системы, не требующей установки Mono для запуска и обладающей высоким быстродействием. При этом, в приложение включаются только необходимые компоненты среды исполнения.

В качестве сборщика мусора в данный момент используется Boehm's GC, однако в текущей разрабатываемой ветке SVN присутствует совершенно новый сборщик мусора, разработанный специально для Mono.

Установка Mono

Mono входит в репозитории огромного количества дистрибутивов, поэтому проблем с установкой из репозитория возникнуть не должно. Другой вопрос, какие версии располагаются в репозиториях. На данный момент на сайте проекта Mono предлагается скачать бинарные файлы версии 2.4.x. Эти же версии лежат в репозиториях современных дистрибутивов. Последней стабильной версией Mono считается 2.6.3, которая имеется только в виде исходных текстов.

Если есть желание установить Mono 2.6.3, то придется заняться самостоятельной сборкой версии из исходных текстов.

В качестве подопытной системы выберем недавно вышедшую Ubuntu 10.04. Тем не менее пользователям других версий и дистрибутивов это не должно особенно огорчать, потому что разница будет только в менеджерах пакетов и именах пакетов.

Для чистоты эксперимента, чтобы определить все пакеты, которые нужны, возьмем систему Ubuntu 10.04 установленную с нуля и обновленную (при помощи Synaptic или aptitude) до текущего состояния.

Первым делом создадим каталог для исходных текстов и сборки проектов:

Для работы с пространством имен System.Windows.Forms (на классах которого построен графический интерфейс операционных систем семейства Microsoft Windows) необходимо установить библиотеку libgdiplus, которая реализует функции Microsoft GDI+ для Mono. Взять исходные тексты этой библиотеки можно с сайта проекта Mono:

Распакуем исходные тексты и перейдем в каталог проекта:

При базовой установке Ubuntu устанавливается минимальный набор инструментов для разработчика, поэтому необходимо проследить, чтобы нужные инструменты присутствовали в системе. Для установки и работы потребуются компилятор g++, парсер Bison, интерпретатор макроязыка M4, библиотека Glib 2.0, GetText для поддержки интернационализации. Для работы с Mono требуется также Pkg-config. При отсутствии в системе эти пакеты (и их зависимости) нужно будет установить. Для Ubuntu это делается командой:

Для работы библиотеки libgdiplus нужна библиотека libcairo2 версии не ниже 1.6.4. Эта библиотека входит в состав исходных текстов libgdiplus и может быть скомпилирована совместно с ней, однако при наличии более свежей версии рекомендуется пользоваться именно ей. В репозиториях Ubuntu 10.04 лежит libcairo2 версии 1.8.10. Установим ее из репозитория:

Остается только сконфигурировать и собрать libgdiplus. По умолчанию установка производится в каталог /usr/local/bin для библиотеки и /usr/local/include для заголовочных файлов, что не всегда удобно, так как в будущем понадобится настройка переменных окружения LD_LIBRARY_PATH и LD_RUN_PATH. Удобнее, если библиотеки и заголовочные файлы будут расположены в /usr/bin и /usr/include соответственно.

Скачиваем mono runtime:

Рассмотрим наиболее интересные параметры конфигурации исходных текстов:

Этот параметр установлен в yes по умолчанию. При этом mono оптимизмруется для работы под средствами виртуализации Xen. В реальной среде производительность несколько ниже. Мы в нашем случае будем использовать no.

Возможность выделения приложением больших объемов памяти (свыше 3 Гб). По умолчанию no.

Включение поддержки Moonlight — свободного аналога Microsoft Silverlight.

Местоположение библиотеки libgdiplus для поддержки классов System.Windows.Forms. Значение installed означает, что библиотека установлена в системе (как в нашем случае), sibling — исходные тексты библиотеки лежат в каталоге с текстами mono, <path> — библиотека установлена по указанному пути (используется, если библиотека установлена в нестандартный каталог или установлено несколько разных версий в разных каталогах).

Включение поддержки больших массивов, у которых индекс выходит за пределы Int32.MaxValue. По умолчанию такие массивы не поддерживаются даже в 64-битных системах (в том числе и в Microsoft Windows для архитектуры x64).

Включение многопоточного сборщика мусора при наличии нескольких процессоров. По умолчанию сборщик мусора однопоточный. Следует заметить, что разработчики Mono предупреждают, что возможность является экспериментальной и не протестирована тщательно.

Конфигурируем и устанавливаем Mono:

В моем случае изначально сборка закончилась неудачно в связи с тем, что make почему-то не хватило прав, хотя собиралось все в домашнем каталоге пользователя. Если вдруг такое произошло, помогает sudo make вместо make.

Mono Runtime готов к работе.

Создание первого приложения

С целью протестировать работоспособность Mono создадим традиционное приложение Hello World с выводом в терминал и вариант с созданием окна.

Для вывода в терминал воспользуемся методом WriteLine класса Console.

Компиляция должна пройти без ошибок и запуск:

Не забываем указать ключ -pkg:dotnet, подключающий библиотеки, содержащие пространство имен System.Windows.Forms.

на экране появится пустое окно с заголовком “Hello World! This is our first Mono program” и кнопками сворачивания, разворачивания и закрытия.

MoMA — анализатор “чужих” сборок

В этом поможет инструмент Mono Migration Analyzer (MoMA), который можно скачать с сайта проекта Mono.

Для запуска MoMA его нужно распаковать в отдельный каталог и запустить сборку MoMA.exe:

Тестирование сборок на совместимость состоит из пяти шагов и интуитивно понятно, более того реальный шаг всего один — выбор сборок для тестирования, остальные шаги содержат справочную информацию, итоги тестирования и форму для сбора информации о том, как улучшить данный инструмент.

Следует отметить, что MoMA — инструмен достаточно простой, поэтому возможны варианты, что какие-то проблемы в коде найдены не будут, а также возможно нахождение проблемы, которая, тем не менее, не помешает исполнению кода.

Все проблемы, которые находит MoMA можно свести к четырем видам.

  1. Missing Methods — отсутствующие методы.В сборке присутствует вызов методов, которые не имеют никакой реализации (в том числе даже заглушки) в Mono. Если такое приложение попытаться скомпилировать в Mono, это приведет к ошибке вида: Если же данный код скомпилировать, например, в Visual Studio, а затем запустить в среде Mono, это приведет к исключению System.MissingMethodException при вызове отсутствующего метода.

Бороться с этой проблемой можно двумя способами. Первый состоит в том, чтобы заменить отсутствующий метод другими методами, реализующими ту же задачу. Второй состоит в том, чтобы реализовать отсутствующий метод и, по возможности, предложить его для включения в новую версию Mono.

Если же вызов происходит из COM-объектов, написанных самостоятельно, то должна быть обеспечена их кроссплатформенность, тогда ошибок при исполнении кода не будет. В противном случае лучше изменить реализацию так, чтобы вызовы из COM-объектов не использовались.

Работа с MoMA из командной строки

В случае, если использование графического интерфейса не нужно или невозможно, можно использовать MoMA из командной строки.

При этом указывается параметр --nogui, может быть указан параметр --out с указанием месторасположения отчета об анализе, а затем указывается одна или несколько анализируемых сборок. Например:

Заключение

  • Соберем из исходников и установим mono 3.2.1
  • Добавим monoserve скрипт в init.d для автоматического запуска сайтов и управления ими.
  • Установим nginx 1.4.1
  • Создадим и настроим простой сайт, чтобы проверить работоспособность всей связки.

Установка всего одной строчкой в консоли

Одна строчка для закачивания скрипта, установки ему права на запуск и собственно запуска. Вначале попросит жмякнуть [Enter] для добавления репозитория, а позже еще раз попросит пароль на sudo.

Выполнение всего скрипта зависит от скорости интернета и мощности железа. В среднем около 40 минут.

Требования

image

Предполагается установка на чистую Ubuntu Server 12.04.3 x64 либо Ubuntu Server 13.04 x64.
ОС установлена без роли:

Рекомендую сразу после установки ОС в виртуальную машину сохранить снапшот чистой системы. Очень удобно для экспериментов.
Тестирование скрипта происходило в домашней директории с непривилегированного юзера, но с правами на sudo.

Установка mono & co

Для установки mono нам нужны некоторые зависимости и утилиты. Установим их:


После этого клонируем и собираем libgdiplus, mono и xsp именно в такой последовательности. Все файлы будем держать в отдельной директории

image

Сверим версию mono -V?

nginx

nginx является одним из рекомендуемых веб серверов для связки с mono. Возможно взаимодействие nginx+mono через FastCGI (предпочтительный метод) либо как reverse proxy для xsp.

xsp — это сервер для тестирования и отладки сайтов на mono. Для пром среды его использование не рекомендуется.

Ничего особенного в устанавке nginx нет. Подключаем репозиторий, обновляем список пакетов и устанавливаем nginx.

monoserve

  • В директории /usr/local/etc/mono/fcgi/apps-available/ хранятся настройки доступных серверов
  • В директории /usr/local/etc/mono/fcgi/apps-enabled/ создаются симлинки на те из них, которые сейчас должны работать

Пример содержания такого файла (одна строчка):
/:/home/anvol/www

Как видим, это всего лишь "/:" + путь к приложению. К сожалению, текущая версия скрипта правильно запускает только один такой сервер. Планируется доработка monoserve, чтобы в конфигурационных файлах можно было указать также порт приложения либо название unix-socket'а. Тогда станет возможным запустить несколько сайтов на одном сервере.

/www и настроим monoserve для его запуска

После этого мы имеем запущенный fastcgi-mono-server4 на порту 9001, который готов выполнять сайт из папки

Настройка nginx

Завершающим аккордом будет настройка nginx. Первым делом мы отключим дефолтный сервер убрав симлинк на него из /etc/nginx/sites-enabled/:


Теперь добавим в /etc/nginx/fastcgi_params необходимые настройки:


Напишем конфигурацию для нашего сервера mono:


Включаем нашу конфигурацию, создавая симлинк в /etc/nginx/sites-enabled, и просим nginx принять изменения в работу


Заходим браузером на ip-вашей-виртуалки либо проверяем работу сайта в консоли:

image

Пользуйтесь на здоровье.

Планы

Приветствуются замечания к скрипту, пожелания на его будущие доработки. Спасибо.

Проект Mono

Проект Mono спонсируется компанией Ximian, той самой, которая дала нам графический рабочий стол GNOME. Лидер проекта -- мексиканский программист, главный технический директор Ximian - Мигель де Иказа (Miguel de Icaza). На мой взгляд разработчики, привлеченные к работе над проектом Mono, в очень короткое время проделали огромный объем работ. Между прочим, слово "Mono", в переводе с испанского, означает "обезьяна". А ребят из Ximian обезьяниичать учить не надо!

Привет, мир Mono!

и сохраните его с именем hello.cs.

Чтобы запустить наш скомпилированный пример необходимо воспользоваться программой mono , которая представляет собой виртуальную машину Mono. В результате выполнения следующей команды:

На стандартный вывод (окно терминала и т.п.) будет выведена строка:

За кулисами

А теперь давайте "заглянем" внутрь скомпилированного файла - сборки. Программа monodis (Mono дизассемблер) выводит содержимое сборки в текстовом представлении. Введите следующую команду:

Дизассемблер должен вывести нечто подобное:

В первом разделе находятся метаданные. Они содержат текущую версию программы, дополнительные ограничения по безопасности, информацию о локали и список внешних сборок, используемых данной сборкой. Все остальное - это код на промежуточном языке (IL). Здесь можно видеть два метода:

  1. Конструктор класса по-умолчанию - .ctor , который создается компилятором автоматически.
  2. Наш метод Main .

Как уже говорилось ранее, виртуальная машина использует JIT-компилятор (just-in-time - "на лету") для трансляции кода на промежуточном языке (IL) в машииный код. Трансляция производится только тогда, когда в этом возникает необходимость (отсюда и название "на лету" - just-in time). В нашем случае, для метода Main генерируется следующий машинный код (синтаксис языка ассемблера AT&T):

Кроме того, в состав Mono входит интерпретатор mint . Эта программа, вместо JIT-компиляции выполняет интерпретецию инструкций промежуточного языка (IL). Если говорить о скорости выполнения, то для нашего конкретного примера интерпретатор mint дает несколько более высокую скорость исполнения, поскольку не тратится время на компиляцию и размещение скомпилированного кода в памяти. Конечно же, машинный код, уже размещенный в памяти, выполняется намного быстрее чем интерпретация IL. В настоящее время JIT-компилятор Mono существует только для платформы x86. На других платформах следует использовать интерпретатор. Чтобы увидеть результат работы интерпретатора, выполните следующую команду:

О преимуществах

  • Программы могут быть запущены на любом типе процессора, под управлением любой операционной системы, поддерживающей платформу CLI, без необходимости перекомпиляции.
  • Полная интеграция нескольких языков программирования.
  • Система поддерживает важные меры безопасности.
  • Единая среда исполнения, разделяемая всеми CLI-совместимыми языками программирования.
  • Непротиворечивая объектная модель, используемая всеми CLI языками, включая стандартный API, предлагаемый единственной базовой библиотекой классов. Изучив API - вы можете использовать его в любом языке программирования, поддерживаемом платформой.
  • Упрощенная модель установки приложений. Отпадает необходимость регистрации модуля в системном реестре.
  • Несколько версий одной и той же библиотеки (DLL) могут гармонично сосуществовать на одном компьютере
  • Появление новых конструкций, таких как свойства, события и аттрибуты, заметно упрощает построение программных компонент.
  • Отпадает необходимость в отдельных заголовочных файлах языка описания интерфейсов (IDL).
  • Упрощен механизм контроля версий.
  • Унифицированная система безопасных типов. Все типы данных (включая простые типы) порождены от единственного базового класса.
  • Автоматическое управление памятью, с помощью сборщика "мусора".
  • Тесная интеграция в CLI.

Ссылки

От переводчика: Не могу не привести интереснейшие ссылки на русскоязычные ресурсы, которыми я пользовался в процессе работы над документом.

Читайте также: