C # создать DLL плагин, который реализует интерфейс - PullRequest
4 голосов
/ 18 июля 2011

Я пишу простую программу на основе плагинов. У меня есть интерфейс IPlugin, который имеет некоторые методы и функции, и List<Plugin> в моей основной программе. Для простоты, скажем, это определено так:

public interface IPlugin
{
    public void OnKeyPressed(char key);
}

Каждый раз, когда нажимается клавиша, я перебираю список плагинов и вызываю OnKeyPressed(c) для каждого из них.

Я могу создать такой класс и добавить его в список ...

public class PrintPlugin
{
    public void OnKeyPressed(char key)
    {
        Console.WriteLine(c);
    }
}

А потом, когда вы нажимаете клавишу, она распечатывается. Но я хочу иметь возможность загружать плагины из DLL-файлов. Эта ссылка была полезной, но она не объясняет, как классы в DLL реализуют мой интерфейс IPlugin ... Как я могу это сделать? Я действительно не хочу копировать файл IPlugin.cs каждый раз, когда я хочу создать плагин ...

Ответы [ 3 ]

6 голосов
/ 19 июля 2011

Если я вас правильно понимаю ...

Создать 3 проекта:

Проект 1: Ваша основная программа (та, в которой есть список)

Проект 2: проект с вашим интерфейсом

public interface IPlugin
{
public void OnKeyPressed(char key);
}

Проект 3: Пример плагина

public class PrintPlugin : IPlugin
{
public void OnKeyPressed(char key)
{
    Console.WriteLine(c);
}
}

Затем добавьте проект 2 в качестве ссылки на оба проекта 1 и 3.

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

Я использовал это в нескольких проектах, и это мне хорошо послужило.

2 голосов
/ 19 июля 2011

Возможно, вы захотите взглянуть и на Managed Extensibility Framework .Он предоставляет полный API для написания программ на основе плагинов и охватывает множество проблем, таких как безопасность, если вы когда-нибудь планируете сделать API плагинов доступным для третьих лиц.

0 голосов
/ 19 июля 2011

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

1) AppDomain.CurrentDomain.GetAssemblies () метод возвращает список загруженных сборок в текущем AppDomain

2) Поиск всех библиотек DLL в папке, в которую должны быть помещены плагины, и проверка наличия в списке определенной сборки. Если нет, используйте метод Assembly.Load для загрузки этой сборки, найдите в нем класс IPlugin и, наконец, добавьте его в объект List.

...