По просьбе @Andrey, это разработка моего комментария к OQ:
Плагины (как в сборках плагинов) чаще всего содержат класс, который реализует интерфейс, такой как IMyPlugin
В большинстве случаев этот интерфейс должен иметь метод, подобный InitPlugin()
, который позволяет плагину настраивать его структуры и т. Д., Т.е. инициализировать.
Этот InitPlugin () сам по себе хочет больше всегочасто вызывайте что-то вроде RegisterPlugin () в основной программе, чтобы зарегистрировать его функциональность в приложении.Обычно это также достигается с помощью интерфейса, такого как IMyPluginHost
.
Теперь, пока вы сохраняете эти интерфейсы настолько общими, что их сами по себе менять не нужно, вы можете легко добавить подтверждение версии с помощью этой последовательности:
public interface IMyPluginHost
{
public int RegisterPlugin(int FunctionalityGroup, object WorkerBee, int MinSDKVersion, int MaxSDKVersion);
... //Whatever you need to allow the plugin to call into the app
}
public interface IMyPlugin
{
public int InitPlugin(IMyPluginHost myhost); //Return value is hust an error code
... //Whatever you need to allow the app to call into the plugin
}
Теперь, когда приложение решит загрузить плагин, оно создаст свой внутренний хост-класс плагина, который реализует IMyPluginHost
, затем физически загрузит плагин, получит IMyPlugin
в своем классе и вызовет
((IMyPlugin)pluginClass).InitPlugin(this)
Теперь плагин может циклически изменять свои функциональные группы (какие группы существуют, зависит от вашего приложения - если это, например, приложение для работы с изображениями, могут существовать такие функциональные группы, как Filter, FileTypeImport, FileTypeExport, Brush, ... каждый со своим интерфейсом) и для каждого экземпляра рабочего объекта, затем вызовите
host.RegisterPlugin(FunctionalityGroup, WorkerBee, MinSDKVersion, MaxSDKVersion);
с хостом, равным IMyPluginHost
, полученным в качестве аргумента для InitPlugin()
.
Таким образом, если плагин построен только для SDK V5, MinSDKVersion и MaxSDKVersion будут равны 5. Но если умный плагин может обрабатывать SDK версии 2-5 мин.DKVersion будет 2, а MaxSDKVersion будет 5. Это позволяет одному плагину работать с различными версиями вашего приложения (и, следовательно, SDK)
Само приложение также имеет ряд поддерживаемых версий SDK, скажем 3-6,Так что в этом случае вызов RegisterPlugin()
вернет 5, так как это самая высокая версия SDK, которую поддерживают оба партнера.Опять же, это дает вашему приложению возможность поддерживать старые плагины, так что при обновлении вашего приложения не нарушаются все сторонние плагины.
Отрицательные возвращаемые значения для InitPlugin()
будут ошибками.
После того, как это сделано, плагин имеет ссылку на хост и знает, чего он может ожидать от него с точки зрения версии SDK и наоборот.