Показать сообщение отдельно

Использование плагинов в .NET
  #17  
Старый 20.12.2008, 10:37
W!z@rD
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме:
1892597

Репутация: 836


По умолчанию Использование плагинов в .NET

Введение
Данный материал ни на что не претендует.
Сегодня просто стало интересно, как же использовать плагины в .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 xint 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 (!= null)
                        {
                            
IPlugin plugin = (IPluginActivator.CreateInstance(type);
                            
plugins.Add(plugin.Descriptionplugin); //Добавление интерфейса
                            
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 xint y//реализация метода
        
{
            return 
y;
        } 
Наследуем интерфейс и реализуем...
Конец
ну вот и все...
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
 
Ответить с цитированием