Написание аддин или плагин фреймворк на C # - PullRequest
6 голосов
/ 28 января 2012

Я пишу Addin Framework на C #, и мне интересно, как я могу сделать Addin выгружаемым без перезагрузки приложения.

Я слышал о доменах приложений, но как они работают?Может ли Addin добавлять классы расширяемости и вызываться в главном домене приложений через интерфейсы и при этом оставаться загружаемым и вызывать код очистки, в результате чего эти классы удаляются без того, чтобы эта сборка находилась в главном домене приложений?

Или существуют другие методыВы получаете выгружаемые надстройки, но IIRC, кроме AppDomain, вы не можете выгружать сборку.

Я также хочу, чтобы механизм надстроек был совместим с Mono, если это возможно, поэтому любые ответы стараются оставаться совместимыми с Mono, если это возможно.

Ответы [ 3 ]

7 голосов
/ 28 января 2012

Возможно, вы захотите посмотреть на Mono.Addins .Вот несколько хороших примеров здесь , вот некоторые подробности:.

Следующий код является базовым примером хост-приложения надстройки.Это приложение выполняет набор команд, которые могут быть реализованы с помощью надстроек:

using System;
using Mono.Addins;

[assembly:AddinRoot ("HelloWorld", "1.0")]

class MainClass
{
    public static void Main ()
    {
        AddinManager.Initialize ();
        AddinManager.Registry.Update ();

        foreach (ICommand cmd in AddinManager.GetExtensionObjects<ICommand> ())
            cmd.Run ();
    }
}

Точка расширения для приведенного выше примера может быть объявлена ​​следующим образом:

using Mono.Addins;

[TypeExtensionPoint]
public interface ICommand
{
    void Run ();
}

Надстройка, расширяющая указанную точку расширения, будет выглядеть следующим образом:

using System;
using Mono.Addins;

[assembly:Addin]
[assembly:AddinDependency ("HelloWorld", "1.0")]

[Extension]
public class HelloCommand: ICommand
{
    public void Run ()
    {
        Console.WriteLine ("Hello World!");
    }
}
3 голосов
/ 06 января 2013

Динамически загружаемые плагины / надстройки

Вы явно не спрашивали, как динамически загружать надстройки или плагины, но вы видите этот вопрос мой ответ ) на StackOverflow.com о том, как это сделать.

Выгрузка плагинов и надстроек

Есть только один способ, о котором мне известновыгрузить динамически загружаемые плагины и надстройки: загрузив надстройку в отдельный AppDomain и выгрузив AppDomain.Для получения дополнительной информации см. в этой статье на MSDN .

Существующие структуры надстроек / плагинов

Зачем заново изобретать то, что уже существует?Я знаю о двух плагинах.

Некоторые люди говорят о Managed Extensibility Framework (MEF) как о плагине или надстройке, которую оннет.Для получения дополнительной информации см. этот вопрос StackOverflow.com и этот вопрос StackOverflow.com .

0 голосов
/ 28 января 2012

«Выгрузка» надстройки состоит из двух частей.

  1. Отмените регистрацию надстройки, чтобы она не «подключалась» к вашей программе (она не подключена к каким-либо событиям, содержит какие-либо блокировки ресурсов, не нужна или не вызывается основной программой в любое время и является не работает активно какой-либо код).

  2. Выгрузите сборку, содержащую код расширения.

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

Вы сами решаете, отвечает ли надстройка за это (в этом случае мошенническое дополнение может удалить все приложение, если оно не очищается должным образом), или должна ли инфраструктура надстройки обеспечить механизмы для подключения к основному приложению, чтобы оно могло очистить все ссылки между приложением и надстройкой автоматически (т. е. запустить надстройку в более безопасной «песочнице», где она менее способна отрицательно повлиять на стабильность приложения или других надстроек).

Как только надстройка закрывается, она становится полностью бездействующей, и тогда ее можно будет безопасно выгружать. (Однако, если вы не хотите обновлять dll надстройки во время работы программы, вы можете обнаружить, что вам даже не нужно выгружать надстройку - простое отключение может удовлетворить ваши потребности)

...