Проект "MonoDevelop Add-in для PascalABC.NET"
Mono.Addins Reference Manual
Введение
Mono.Addins является основой для создания расширяемых приложений, а также для создания библиотек, расширяющих эти приложения(аналог "плагинов").
Эта структура вытекает из использования MonoDevelop, путем добавления в MonoDevelop расширяемых приложений (extensible applications), хотя MonoDevelop был полностью переписан и усовершенствован, существует множество способов сделать его более общим и простым в использовании. Добавление в программу MonoDevelop "плагинов" (Mono.Addins) реализованно намного удобней, чем по сравнению с инструментом SharpDevelop, который реализован на основе идей от Eclipse add-in engine (добавления "плагинов" в системе Eclipse).
Mono.Addins был разработан, чтобы быть полезным для широкого спектра приложений: от простых приложений с малыми потребностями расширения(дополнения к коду) до сложных приложений (таких как сам MonoDevelop), которые нуждаются в поддержке: в больших дополнениях в структурах программы.
Этот документ включает в себя подробное описание всех функций, которые предоставляет Mono.Addins. Если у Вас есть вопросы или предложения о Mono.Addins, подпишитесь на рассылку разработчиков Mono.Addins (http://groups.google.com/group/mono-addins).
Основы Mono.Addins
Модель расширения Mono.Addins базируется на четырех концепциях:
Add-in host: приложение или библиотека, которые могут быть расширены с помощью add-ins. Расширение возможностей определяется посредством точек расширения(extension points).
Extension point: пространство, гед add-ins могут регистрировать extension nodes(узлы расширекния) для расширения функциональности. Extension points определяются путем использования extension paths(путей расширения).
Extension node: Атрибут оформления элемента, описывающий расширения. Extension nodes(узлы расширения) типизированные. extension points могут объявить, какие типы extension nodes они принимают.
Add-in: Набор файлов, которые регистрируют новые узлы в одной или нескольких точек расширения, определяются add-in hosts. Add-in может дополнять add-in host, и может реализовываться разными add-ins.
Mono.Addins определяется оделью описания Add-in, с использованием add-ins and add-in hosts для описания индормации расширения. Add-in может быть представлен с использованием XML манифеста(объявления), или с применением атрибутов и типов.
В результатте Mono.Addins записывается в виде API (выполняя Mono.Addins.dll) который встраивается при выполнении.
Для примера рассотрим базовое приложение Mono.Addins.
Простейший пример
Реализуем текстовый редактор к которому будем подключать наши add-ins. Рассмотрим диаграмму, на колторой отображена схема работы программы.
Далее рассмотрим, как расширить возможности текстового редактора, используя возможности Mono.Addins.
Мы хотим разрешить add-ins выполнять последние изменения при запуске приложения.
Приложение текстового редактора состоит из 2-х сборок:
1)TextEditor.exe это само приложение.
2)TextEditorLib.dll определяет насколько дополнительных интерфейсов для приложения
Далее мы видим базовую структуру.
ICommand library (TextEditorLib.dll)
public interface ICommand
{
string Run ();
}
Это очень просто пример с одним методом: run. Редактор выполяет этот метод в вконце.
Add-in host manifest (TextEditor.addin)
<Addin id="TextEditor" version="1.0" isroot="true">
<Runtime>
<Import assembly="TextEditor.exe"/>
<Import assembly="TextEditorLib.dll"/>
</Runtime>
<ExtensionPoint path = "/TextEditor/StartupCommands">
<ExtensionNode name="Command" type="Mono.Addins.TypeExtensionNode"/>
</ExtensionPoint>
</Addin>
Основной манифест включает следующую информацию:
1)Элемент Addin объявляет главный идентификатор и версию. Корневой атрибут определяет что необходимо добавить в манифест.
2)Элемент времени выполнения определяет файлы принадлежащие хосту.
3)Элемент точки расширения определяет новую точку расширения. Атрибут определяет местоположение точки расширения в дереве расширения.
4)Элемент узла расширения определяет тип узла, который принимает точку расширения. В этом случае, точка расширения позволяет только узлам типа TypeExtensionNode, которые будут определены в расширениях, используя имя Command.
The host application (TextEditor.exe)
public class TextEditorApplication
{
public static void Main ()
{
// Initialize the add-in engine
AddinManager.Initialize ();
// Get the extension nodes in the extension point
foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/TextEditor/StartupCommands")) }
ICommand command = (ICommand) node.CreateInstance ();
command.Run ();
}
} }