Введение
Данный материал ни на что не претендует.
Сегодня просто стало интересно, как же использовать плагины в .NET?
Если в Win32 это LoadLibrary & GetProcAddr, то в .NET это ...?
P.S. надеюсь орфографических ошибок не будет =)
ссылка на сорцы и бинарники - http://www.sendspace.com/file/72o96u
Требования: .NET Framework 2.0
Извиняюсь за отсутствие комментов в коде
На чем будет все базироваться?
Грубо говоря все основывается на интерфейсе, который должен быть реализован в плагине.
Расмотрим интерфейс который я использовал:
PHP код:
public interface IPlugin
{
string Description { get;}
object Calc(int x, int y);
}
Тут 2 поля.
1 - string Description - аксессор. Возращает описание плагина;
2 - object Calc - функция. Принимает 2 параметра int типа, возвращает объект - object, который можно конвертнуть в необходимый.
Данная библиотека добавляется в ссылки и в лоадере и в плагине.
Лоадер
Собственно вот и лоадер...
Что он из себя представляет? Обычное WinForm приложение.
Создаем экземпляр объекта Hashtable;
PHP код:
readonly Hashtable plugins = new Hashtable();
Ниже приведу список методов и описание:
private void GetPlugins() - данная функция ищет плагины (об этом поподробнее ниже)
private void button1_Click - обработчик нажатия на кнопку (иницирует работу плагина (точнее его метод, реализация интерфейса))
PHP код:
private void GetPlugins()
{
string[] files = Directory.GetFiles(Application.StartupPath, "*.dll"); //получаем файлы с расширением dll в папке откуда был запущен Exe
foreach (string file in files)
{
try
{
Assembly assembly = Assembly.LoadFile(file);//загружаем сборку
foreach (Type type in assembly.GetTypes())
{
Type f = type.GetInterface("Core.IPlugin"); //попытаемся получить интерфейс
if (f != null)
{
IPlugin plugin = (IPlugin) Activator.CreateInstance(type);
plugins.Add(plugin.Description, plugin); //Добавление интерфейса
comboBox1.Items.Add(plugin.Description); //В список добавляем описание плагина
ListViewItem item = new ListViewItem();
item.Text = file;
item.SubItems.Add(plugin.Description);
listView1.Items.Add(item);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки плагина\n" + ex.Message); //опс... =(
}
}
}
Реализация плагина
PHP код:
public class Class1:IPlugin //наследование интерфейса
{
public string Description //описание
{
get
{
return "Plugin1 description";
}
}
public object Calc(int x, int y) //реализация метода
{
return x + y;
}
Наследуем интерфейс и реализуем...
Конец
ну вот и все...