Обработка событий в плагине c # - PullRequest
1 голос
/ 03 декабря 2010

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

Плагин эффективно возвращает TabPage, который вставлен в основное приложение и управляется с помощью плагина dll.

Если в плагине возникает ошибка, появляется стандартное сообщение об ошибке Windows. Что я хочу сделать, это создать событие, которое возвращает сообщение об ошибке, чтобы я мог отобразить его в области, зарезервированной для текста.

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

В настоящее время моя система перебирает библиотеки DLL в папке приложения, и загружаются те, которые соответствуют контракту интерфейса, фактический экземпляр интерфейса отбрасывается каждый раз, когда управление передается DLL через события кнопки, которые загружаются с помощью TabPage и обрабатываются в плагине.

Надеюсь, все это имеет смысл.

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Вы можете добавить событие к вашему контракту с плагином:

public interface IPlugin
{
    event EventHandler<ErrorEventArgs> Error;

    void Initialise();
}

Таким образом, любой хост может подписаться на это событие при возникновении ошибок в плагине:

public class MyPlugin : IPlugin
{
    public event EventHandler<ErrorEventArgs> Error;

    public void Initialise()
    {
        try
        {

        }
        catch (Exception e)
        {
            OnError(new ErrorEventArgs(e));
        }
    }

    protected void OnError(ErrorEventArgs e)
    {
        var ev = Error;
        if (ev != null)
            ev(this, e);
    }
}
3 голосов
/ 03 декабря 2010

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

1 голос
/ 03 декабря 2010

Если я следил за вашей публикацией правильно, я бы поступил так.

В интерфейсе плагина (скажем, IPlugin) вам нужно объявить событие.

public delegate void ShowErrorEventHandler(string errorMessage);
public interface IPlugin
{
    event ShowErrorEventHandler ShowError;
}

Затем, когда вы загружаете свои плагины, для каждого из них просто подпишитесь на событие ShowError, например:

...
foreach(var plugin in plugins)
{
    plugin.ShowError += MainForm_ShowError;
}
...

private void MainForm_ShowError(string errorMessage)
{
    // Do something with the error... stick it in your reserved area
    txtReservedArea.Text = errorMessage;
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...