Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
developers:tutorial:module [2018/10/11 20:14] vasya |
developers:tutorial:module [2022/03/15 19:10] (текущий) proxor |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Создание и подключение первого модуля ====== | + | ====== Создание первого модуля ====== |
- | Запустите редактор Visual Studio, выберите создание нового проекта. В качестве шаблона используйте "Классическое приложение для Windows", а в качестве типа "Библиотека классов (.NET Framework)". В качестве платформы укажите ".NET Framework 3.5". | + | |
- | {{ :developers:tutorial:module:create_project.png?direct&400 |Рисунок 1. Создание проекта}} | + | |
- | Настроим проект так, чтобы он собирался в каталог с программным комплексом Топоматик Робур, запускал его при отладке и добавим к проекту цифровую подпись. Для этого перейдите в свойства проекта. | + | |
- | {{ :developers:tutorial:module:project_properties.png?direct&400 |Рисунок 2. Свойства проекта }} | + | |
- | Откройте вкладку "Сборка", в качестве выходного пути для всех конфигураций выберите каталог с программным комплексом Топоматик Робур. | + | |
- | {{ :developers:tutorial:module:build_prop.png?direct&400 |Рисунок 3. Свойства проекта - Сборка}} | + | |
- | Откройте вкладку "Отладка", в качестве действия при запуске выберите запуск внешней программы и укажите исполняемый файл программного комплекса. | + | |
- | {{ :developers:tutorial:module:debug_prop.png?direct&400 |Рисунок 4. Свойства проекта - Отладка}} | + | |
- | Откройте вкладку "Подписывание", выберите подписать сборку и "<Создать>" в качестве ключа строгого имени. В появившемся диалоге укажите имя файла ключей. Защищать файл ключей паролем не обязательно. | + | |
- | {{ :developers:tutorial:module:signing_prop2.png?direct&400 |Рисунок 5. Свойства проекта - Подписывание}} | + | |
- | Теперь необходимо добавить в проект ссылки на сборки программного комплекса, необходимые для создания собственных модулей. Сборки, которые нужно подключить это: | + | |
- | * Topomatic.ApplicationPlatform.dll | + | |
- | * Topomatic.Controls.dll | + | |
- | * Topomatic.FoundationClasses.dll | + | |
- | * Topomatic.Stg.dll | + | |
- | <note>Первые три сборки находятся в каталоге с программным комплексом, а сборка Topomatic.Stg.dll находится в глобальном кэше сборок (C:\Windows\assembly\GAC_MSIL\Topomatic.Stg\).</note> | + | |
- | Откройте диалоговое окно Менеджер ссылок. | + | |
- | {{ :developers:tutorial:module:add_reference.png?direct&400 |Рисунок 6. Добавление ссылки через контекстное меню}} | + | |
- | Перейдите на вкладку "Обзор", нажмите кнопку "Обзор" и укажите необходимые файлы сборок. | + | |
- | {{ :developers:tutorial:module:browse_reference.png?direct&400 |Рисунок 7. Менеджер ссылок - Обзор}} | + | |
- | Кроме того необходимо подключить ссылки на системные сборки: | + | |
- | * System.Drawing | + | |
- | * System.Windows.Forms | + | |
- | Сделать это можно на вкладке "Сборки" диалогового окна Менеджер ссылок. | + | |
- | {{ :developers:tutorial:module:system_reference.png?direct&400 |Рисунок 8. Менеджер ссылок - Сборки}} | + | |
- | После того как необходимые сборки подключены, нужно запретить их копирование при сборке вашего модуля. Для этого необходимо выделить все сборки программного комплекса в дереве структуры проекта, и поставить значение флага "Копировать локально" в "False". | + | |
- | {{ :developers:tutorial:module:copy_local.png?direct&200 |Рисунок 9. Свойство копировать локально}} | + | |
- | Теперь проект готов к работе. Можно приступить к созданию Вашего первого модуля. Необходимо создать следующие элементы: | + | Создайте и настройте новый [[developers:tutorial:project|проект]] Visual Studio. |
+ | |||
+ | Для создания и подключения модуля к программному комплексу [[http://www.topomatic.ru|Топоматик Робур]] необходимо создать следующие элементы: | ||
* Класс реализующий функциональность модуля | * Класс реализующий функциональность модуля | ||
* Класс отвечающий за инициализацию модуля | * Класс отвечающий за инициализацию модуля | ||
* Файл для подключения к программному комплексу. | * Файл для подключения к программному комплексу. | ||
- | Начнем с создания класса, реализующего функциональность модуля. Это должен быть компонент, наследник от Topomatic.ApplicationPlatform.Module. Создайте новый класс компонента и назовите его "Module". | + | Начнем с создания класса, реализующего функциональность модуля. Это должен быть наследник от [[developers:references:topomatic.applicationplatform.plugins.plugininitializator|PluginInitializator]]. Создайте новый класс компонента и назовите его "Module". |
{{ :developers:tutorial:module:add_component.png?direct&400 |Рисунок 10. Создание компонента}} | {{ :developers:tutorial:module:add_component.png?direct&400 |Рисунок 10. Создание компонента}} | ||
Откройте окно редактирования кода компонента. | Откройте окно редактирования кода компонента. | ||
{{ :developers:tutorial:module:goto_code.png?direct&400 |Рисунок 11. Перейти к коду компонента}} | {{ :developers:tutorial:module:goto_code.png?direct&400 |Рисунок 11. Перейти к коду компонента}} | ||
- | Измените код класса, сделайте его наследником от Topomatic.ApplicationPlatform.Module. Также можно убрать его из общей области видимости. | + | Измените код класса, сделайте его наследником от [[developers:references:topomatic.applicationplatform.plugins.plugininitializator|PluginInitializator]]. Также можно убрать его из общей области видимости. |
<code csharp> | <code csharp> | ||
- | partial class Module : Topomatic.ApplicationPlatform.Module | + | partial class Module : Topomatic.ApplicationPlatform.Plugins.PluginInitializator |
{ | { | ||
- | public Module() | + | //тут будут объявлены функции, реализующие нужный нам функционал |
- | { | + | |
- | InitializeComponent(); | + | |
- | } | + | |
- | + | ||
- | public Module(IContainer container) | + | |
- | { | + | |
- | container.Add(this); | + | |
- | InitializeComponent(); | + | |
- | } | + | |
} | } | ||
</code> | </code> | ||
- | Теперь создадим класс, отвечающий за инициализацию модуля. Этот класс должен быть наследником от абстрактного класса Topomatic.ApplicationPlatform.PluginHost и находится в общей области видимости. У него необходимо реализовать абстрактное свойство PluginName, возвращающее имя вашего плагина, и абстрактную функцию GetModules() возвращающую список типов модулей. В нашем случае мы вернем только один тип - тип нашего компонента. | + | Теперь создадим класс, отвечающий за инициализацию модуля. Этот класс должен быть наследником от абстрактного класса [[developers:references:topomatic.applicationplatform.plugins.pluginhostinitializator|PluginHostInitializator]] и находится в общей области видимости. У него необходимо реализовать абстрактную функцию GetTypes() возвращающую список типов модулей. В нашем случае мы вернем только один тип - тип нашего класса Module. |
- | Создайте новый класс и назовите его "ModulePluginHost". Наследуйте класс от Topomatic.ApplicationPlatform.PluginHost и реализуйте функции как описано выше. | + | Создайте новый класс и назовите его "ModulePluginHost". Наследуйте класс от [[developers:references:topomatic.applicationplatform.plugins.pluginhostinitializator|PluginHostInitializator]] и реализуйте функции как описано выше. |
<code csharp> | <code csharp> | ||
- | public class ModulePluginHost : Topomatic.ApplicationPlatform.PluginHost | + | public class ModulePluginHost : Topomatic.ApplicationPlatform.Plugins.PluginHostInitializator |
{ | { | ||
- | //тут мы возвращаем строку с именем нашего плагина | ||
- | public override string PluginName | ||
- | { | ||
- | get | ||
- | { | ||
- | return "My first module"; | ||
- | } | ||
- | } | ||
- | |||
//тут мы возвращаем типы всех модулей, которые хотим подключить, в нашем примере только один тип | //тут мы возвращаем типы всех модулей, которые хотим подключить, в нашем примере только один тип | ||
- | protected override Type[] GetModules() | + | protected override Type[] GetTypes() |
{ | { | ||
return new Type[] { typeof(Module) }; | return new Type[] { typeof(Module) }; | ||
Строка 76: | Строка 33: | ||
} | } | ||
</code> | </code> | ||
- | Для подключения нашей сборки к программному комплексу нам необходим файл Имя нашей сборки.AddIn. | + | Для подключения нашей библиотеки к программному комплексу нам необходим файл "Имя нашей библиотеки".plugin. |
- | <note>Здесь и далее замените **Имя нашей сборки**, на имя вашего проекта, в примере это **tutorial1**</note> | + | <note>Здесь и далее замените **"Имя нашей библиотеки"**, на имя вашего проекта, в примере это **tutorial1**</note> |
- | Это файл в формате [[https://ru.wikipedia.org/wiki/XML|XML]] который содержит инструкции для программного комплекса, позволяющие загрузить и подключить модули, содержащиеся в нашей сборке. | + | Это [[developers:references:core.plugin|файл]], который содержит инструкции для программного комплекса, позволяющие загрузить и подключить модули, содержащиеся в нашей сборке. |
- | Создайте новый файл и назовите его Имя нашей сборки.AddIn. | + | Создайте новый файл и назовите его "Имя нашей библиотеки".plugin. |
Для этого выберите в контекстном меню проекта "Создать элемент...". | Для этого выберите в контекстном меню проекта "Создать элемент...". | ||
{{ :developers:tutorial:module:add_addin.png?direct&400 |Рисунок 12. Создание элемента}} | {{ :developers:tutorial:module:add_addin.png?direct&400 |Рисунок 12. Создание элемента}} | ||
- | В диалоге добавления нового элемента выберите XML-файл. | + | В диалоге добавления нового элемента выберите текстовый файл. |
- | {{ :developers:tutorial:module:add_addin2.png?direct&400 |Рисунок 13. Выбор XML файла}} | + | {{ :developers:tutorial:module:add_addin2.png?direct&400 |Рисунок 13. Выбор текстового файла}} |
- | Выберите созданный файл в структуре проекта, и назначьте свойству "Копировать в выходной каталог" значение "Всегда копировать", чтобы всегда копировать этот файл в каталог куда Вы собираете Вашу сборку. | + | Выберите созданный файл в структуре проекта, и назначьте свойству "Копировать в выходной каталог" значение "Всегда копировать", чтобы всегда копировать этот файл в каталог куда Вы собираете Вашу библиотеку. |
{{ :developers:tutorial:module:always_copy.png?direct&200 |Рисунок 14. Копирование в выходной каталог}} | {{ :developers:tutorial:module:always_copy.png?direct&200 |Рисунок 14. Копирование в выходной каталог}} | ||
Заполните созданный файл, как показано ниже. | Заполните созданный файл, как показано ниже. | ||
- | <code xml> | + | <code javascript> |
- | <?xml version="1.0" encoding="utf-8" ?> | + | { |
- | <Extensibility FileVersion="1"> | + | "assemblies": { |
- | <Addin> | + | "Имя нашей библиотеки": { |
- | <FriendlyName>Тестовый модуль урок 1</FriendlyName> | + | "assembly": "Имя нашей библиотеки.dll, Имя нашей библиотеки.ModulePluginHost" |
- | <Description></Description> | + | } |
- | <TargetPlaform Name="" Version="15.0"/> | + | } |
- | <Assembly Name="Имя нашей сборки.dll" FullClassName="Имя нашей сборки.ModulePluginHost" /> | + | } |
- | </Addin> | + | |
- | </Extensibility> | + | |
</code> | </code> | ||
- | Тэги ''<FriendlyName>'' и ''<Description>'' это имя и описание плагина, которые будут показаны пользователю. Тэг ''<TargetPlaform>'' указывает версию платформы для которой собирается модуль, на текущий момент версия 15. Тэг ''<Assembly>'' отвечает за подключение сборки, в атрибуте ''Name'' указывается имя сборки, а в атрибут ''FullClassName'' - полное имя класса, наследника от PluginHost, включая его пространство имён. | + | Элемент ''assemblies'' определяет какие сборки будут подключены к программному комплексу и может содержать один или несколько элементов ''assembly''. В нашем случае этот элемент один и представляет из себя строку, содержащую, через запятую имя сборки и полное имя класса, наследника от [[developers:references:topomatic.applicationplatform.plugins.pluginhostinitializator|PluginHostInitializator]], включая его пространство имен. |
- | Если необходимо подключить несколько сборок, можно указать несколько тэгов ''<Assembly>''. | + | |
Выполнив указанные выше действия и скомпилировав проект мы получим полностью работоспособный плагин, подключающий наш модуль к программному комплексу Топоматик Робур. | Выполнив указанные выше действия и скомпилировав проект мы получим полностью работоспособный плагин, подключающий наш модуль к программному комплексу Топоматик Робур. | ||
- | Сейчас наш модуль полностью пустой. Давайте добавим к нему немного функциональности. Для этого вернемся к коду класса "Module" и перекроем в нём метод OnCreateApplication как показано ниже. | + | Сейчас наш модуль полностью пустой. Давайте добавим к нему немного функциональности. Для этого вернемся к коду класса "ModulePluginHost" и перекроем в нём метод [[developers:references:topomatic.applicationplatform.plugins.plugininitializator.initialize|Initialize]] как показано ниже. |
<code csharp> | <code csharp> | ||
//этот метод будет вызван в момент старта программного комплекса | //этот метод будет вызван в момент старта программного комплекса | ||
- | protected override void OnCreateApplication(object sender, CreateApplicationEventArgs e) | + | //при первой инициализации вашего модуля |
+ | //после этого модуль будет закэширован | ||
+ | public override void Initialize(PluginFactory factory) | ||
{ | { | ||
- | base.OnCreateApplication(sender, e); | + | base.Initialize(factory); |
//вызов этого метода покажет стандартный диалог с сообщением | //вызов этого метода покажет стандартный диалог с сообщением | ||
MessageDlg.Show("Привет Робур"); | MessageDlg.Show("Привет Робур"); | ||
} | } | ||
</code> | </code> | ||
- | Этот метод будет вызван при старте программного комплекса, а мы покажем там сообщение, в котором будет написано "Привет Робур". | + | Этот метод будет вызван при старте программного комплекса и мы покажем там сообщение, в котором будет написано "Привет Робур". |
- | <note>Для того чтобы испоьзовать методы статического класса MessageDlg и класс CreateApplicationEventArgs необходимо добавить нужные пространства имен в секцию using. Visual Studio позволяет легко сделать это, нажав правой клавишей на имени класса и выбрав добавление директивы using.</note> | + | Сообщение будет вызвано при старте в момент первой инициализации модуля, потом он будет сохранен и инициализация модуля будет вызываться по требованию. Если необходимо сбросить информацию о сохраненных модулях, можно воспользоваться командой "clearcache" доступной в командной строке. |
- | Теперь мы можем запустить наш проект. Он автоматически соберет нашу сборку в каталог с программным комплексом, скопирует туда же файл AddIn и запустит исполняемый файл программного комплекса, при старте которого мы увидим наше сообщение. | + | |
- | {{ :developers:tutorial:module:hello.png?direct&400 |Рисунок 15. Сообщение - Привет Робур}} | + | |
- | <note>Исходный код примера, вы можете скачать используя эту ссылку | + | <note>Для того чтобы использовать методы статического класса [[developers:references:topomatic.controls.dialogs.messagedlg|MessageDlg]] необходимо добавить нужные пространства имен в секцию using. Visual Studio позволяет легко сделать это, нажав правой клавишей на имени класса и выбрав добавление директивы using.</note> |
+ | Теперь мы можем запустить наш проект. Он автоматически соберет нашу сборку в каталог с программным комплексом, скопирует туда же файл plugin и запустит исполняемый файл программного комплекса, при старте которого мы увидим наше сообщение. | ||
+ | {{ :developers:tutorial:module:hello.png?direct&400 |Рисунок 15. Сообщение - Привет Робур}} | ||
- | {{ :developers:tutorial:module:tutorial1.zip |Архив с кодом примера}}</note> | + | <note>[[developers:tutorial:tutorialcode|Исходный код]] примера расположен в проекте **"tutorial1"**.</note> |