Проект "MonoDevelop Add-in для PascalABC.NET": различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
Строка 126: Строка 126:
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов.  
2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов.  


3)TypeExtensionNode is a special type of node which allows specifying a type. It provides methods for creating instances out of the described type. The host calls the CreateInstance method on each node to get the implementations of ICommand, and then calls Run on each of them.  
3)TypeExtensionNode это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них.  


'''An add-in (SampleAddin.dll)'''
'''An add-in (SampleAddin.dll)'''
Строка 144: Строка 144:
}
}


This add-in provides a simple implementation of the ICommand interface.  
Этот add-in представляет собой простую реализацию интерфейса ICommand.


'''Add-in manifest (SampleAddin.addin)'''
'''Add-in manifest (SampleAddin.addin)'''
Строка 173: Строка 173:
</Addin>
</Addin>


The add-in manifest is similar to the host manifest:  
Add-in манифест схож с главным манифестом(хоста):  


1)It has an Addin root element, although it does not provide Id or Version information. Id and version are not required in add-ins unless they declare new extension points that can be extended by other add-ins.  
1)It has an Addin root element, although it does not provide Id or Version information. Id and version are not required in add-ins unless they declare new extension points that can be extended by other add-ins.  

Версия от 23:55, 15 ноября 2009

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. Рассмотрим диаграмму, на колторой отображена схема работы программы.

Файл:Example.jpg

Далее рассмотрим, как расширить возможности текстового редактора, используя возможности 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 ();

}

} }

Приложение хоста использует Mono.Addins API, чтобы получить узлы зарегистрированных в точке расширения. Для этого:

1)Инициализировать add-in engine, называемый AddinManager.Initialize()

2)Вызываем метод AddinManager.GetExtensionNodes(), чтобы вернуть все зарегистрированные узлы add-ins в точке расширения StartupCommands. Вызов возвращает узлы типа TypeExtensionNode, с точки расширения определенной для такого рода узлов.

3)TypeExtensionNode это особый тип узла, который позволяет указать тип. Он предоставляет методы для создания экземпляров из описанных типов. Принимающий вызов метода CreateInstance на каждом узле, чтобы получить реализацию ICommand, а затем вызывает Запустить на каждом из них.

An add-in (SampleAddin.dll)

class HelloWorldExtension: ICommand

{

public string Run ()

{

Console.WriteLine ("Hello World");

}

}

Этот add-in представляет собой простую реализацию интерфейса ICommand.

Add-in manifest (SampleAddin.addin)

<Addin>

<Runtime>

<Import assembly="SampleAddin.dll"/>

</Runtime>


<Dependencies>

<Addin id="TextEditor" version="1.0" />

</Dependencies>


<Extension path = "/TextEditor/StartupCommands">

<Command type="HelloWorldExtension" />

</Extension>


</Addin>

Add-in манифест схож с главным манифестом(хоста):

1)It has an Addin root element, although it does not provide Id or Version information. Id and version are not required in add-ins unless they declare new extension points that can be extended by other add-ins.

2)The Dependencies element declares dependencies to other add-ins or add-in hosts.

3)The Extension element can be used to declare new extensions. The path property specifies the extension point being extended.

4)The Command element is an extension node. Since nodes of this extension point are of type TypeExtensionNode, extenders must provide a type attribute which specifies the name of the class represented by this node. That's the class that will be created when calling CreateInstance on the node.