Одним из преимуществ будет то, что информация, передаваемая на MyMainApp.Delegate1
, сериализуется для передачи из домена приложения плагина в домен главного приложения. Метод Delegate1
выполнит DoSomething
в основном домене. Они не разделяют память (поэтому прямой доступ к экземплярам объекта невозможен). Таким образом, вы можете динамически запускать методы на других доменах приложений. И если это делается с помощью рефлексии, плагин может запускать не перечисленные методы.
Я бы предпочел не использовать этот тип конструкции, потому что нет никакой проверки во время компиляции вызывающих методов. Я бы предпочел использовать интерфейсы, которые есть в спутниковых сборках. (чтобы основной домен приложения не получал ссылку на / загрузку сборки плагина, чтобы он больше не мог выгружаться)
Другое дело:
Если вы позвоните MyMainApp.SomeMethod("test")
напрямую. Это означает, что плагин должен знать определение загрузчика плагинов. Это означает, что вы получаете жесткую связь (из плагина) с «родительским» приложением (версией). Что делает всю структуру плагина «бесполезной». Вы можете исправить это, внедрив интерфейс ISupportSomeMethod
в MyMainApp, который определен в спутниковой сборке, используемой обоими mainapp и плагином. Если ваш MyMainApp не поддерживает интерфейс ISupportSomeMethod
, плагин не совместим с этой программой. Таким образом, ваш MyMainApp
может поддерживать несколько структур плагинов.
В этом случае вы предпочитаете структуру событий. Потому что дочерний объект хочет вызвать метод своего родителя. Жаль, что вызовы междоменных событий бесполезны, потому что ваш основной модуль загрузит сборку, и она не может быть выгружена. Вы можете написать прокси-класс для этого.