Project

General

Profile

Плагины.

Хочется иметь возможность изменять поведение программы плагинами, возможно, скриптами, содержимое которых будет написано "по-месту", уже у заказчика.

В качестве языка скриптов предлагается использовать C# и VB.Net. (Распространенность, простота, огромные возможности библиотеки .Net)

Ограничением данной системы является невозможность использования "позднего связывания" - определения по имени объекта в момент обращения к нему из текста скрипта.
Все, что будет доступно плагину, должно быть определено заранее, на этапе разработки.

Т.о. плагин - это сборка .Net, возможно, формируемая динамически по исходному тексту. 

Точки расширения. Управляемый код

Точка расширения - предусмотренное место для включения кода из "внешнего объекта" - плагина.

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

Данный интерфейс содержит совокупность методов и связанных с ними структур данных, также заранее определенных в приложении (на этапе разработки) и публично доступных извне.

Плагин - это экземпляр объекта некоторого типа, наследованного от *интерфейса *ТР.

Объект-плагин создается из внешней сборки (м.б. из одного исходного файла или из заранее построенной сборки) самим расширяемым объектом в удобный для него момент времени. Например, при наличии файла плагина.

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

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

Неуправляемый код

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

Поэтому, нам понадобятся объекты смешанных классов, объявленных как неуправляемые, но выполняющие управляемый код:

  1. Объект для объекта плагина. Этот объект прячет в себе управляемый объект-плагин и все нюансы его управляемого создания.
    Данным типом будут пользоваться все, кто захочет расширить неуправляемый код.
  2. Объект для неуправляемой точки расширения, имеющий все необходимые неуправляемые методы и использующий в качестве параметров и возвращаемых значений все необходимые неуправляемые типы.
    Внутри этот объект имеет обычную ТР. Это, по сути, неуправляемый wrapper для управляемой ТР.
    Данный тип зависит от расширяемого приложения и реализуется непосредственно в нем.

Первый объект передается во второй, в котором, уже в управляемом коде, происходит вызов необходимых методов и преобразование переданных/возвращаемых типов.

Add picture from clipboard (Maximum size: 742 MB)