Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написание внешних модулей (plug-ins) под .NET 
:(
    Опции темы
bus
Дата 14.10.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



Имеетя написанная программа, необходимо сделать для неё несколько простеньких плагинов. Как это делается в .NET, кто с этим сталкивался, откликнитесь.
PM MAIL   Вверх
Hidrag
Дата 14.10.2006, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 2
Всего: 25



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


--------------------
user posted image
PM WWW ICQ   Вверх
bus
Дата 14.10.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



отправь пример, буду премного благодарен.
PM MAIL   Вверх
marcusmae
Дата 14.10.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Общий ответ на общий вопрос.
Обычно взаимодействие plugin <-> host реализуется через интерфейсы.
Программа хост имеет interface - оболочку, описывающую требуемую функциональность плагина, например :

Код

public interface PlugIn
{
    int Status { get; }
    int ErrorCode { get; }

    double Compute(double[,] data);
}


Если плагин совместим с хостом, то его assembly в .dll или .exe - файле должна содержать тип (класс), приводимый к реализующий interface PlugIn. В этом случае, можно динамически подгрузить сборку плагина используя функции System.Reflection.Assembly и достать из неё совместимый тип (класс). Далее, обращаться к функциям плагина через интерфейс.

Вот пример того, как я давно загружал тип из сборки. Здесь есть два интерфейса : PluginNotation_NET2_0.ICalcPlugin и PluginNotation_NET1_1.ICalcPlugin. Функция загружает сборку, загружает экспортируемые ею типы и пытается привести каждый к одному из интерфейсов.

(попытался добавить некот. комментарии, чтобы было понятнее)

Код

        public void Load(string FilePath, PluginNotation_NET2_0.IPluginHost Host)
        {
            Type ObjType = null;
            Assembly assembly = null;

            try
            {
                // загружаем сборку плагина из файла
                assembly = Assembly.LoadFrom(FilePath);

                // получаем список экспортируемых сборкой типов
                Type[] asmTypes = assembly.GetExportedTypes();
                if (asmTypes.Length == 1)
                {
                     ObjType = asmTypes[0];
                }
                else
                {
                    // если сборка эспортирует более одного типа, начинаем шарить совместимые
                    System.Collections.Generic.List<int> compatibleTypes =
                        new System.Collections.Generic.List<int>();

                    for (int index = 0; index < asmTypes.Length; index++)
                    {
                        // каждый из типов пытаемся привести к PluginNotation_NET1_1.ICalcPlugin
                        // или к PluginNotation_NET2_0.ICalcPlugin 
                        try
                        {
                            Object Instance = Activator.CreateInstance(asmTypes[index]);
                            if ((Instance is PluginNotation_NET1_1.ICalcPlugin) ||
                                (Instance is PluginNotation_NET2_0.ICalcPlugin))
                                compatibleTypes.Add(index);
                        }
                        catch (Exception e)
                        {
                             // не удалось привести тип : ругаемся
                        }
                    }

                    if (compatibleTypes.Count == 0)
                    {
                        MessageBox.Show("В сборке " + Path.GetFileName(FilePath) +
                            " совместимых типов не обнаружено", "Error",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                    }
                    else
                        if (compatibleTypes.Count != 1)
                        {
                            // найдено более одного типа, совместимого с одним из двух интерфейсов
                        }
                        else
                          ObjType = asmTypes[compatibleTypes[0]];
                }

                // теперь нужно точно определить, может ли плагин работать по интерфейсу
                // PluginNotation_NET2_0.ICalcPlugin 
                if (ObjType != null)
                {
                    PlugIn plugIn = null;
                    try
                    {
                        plugIn = new  
                            PlugIn((PluginNotation_NET2_0.ICalcPlugin)Activator.CreateInstance(ObjType), Host);
                    }
                    catch
                    {
                        // жаль, плагин написан под старую версию NET Framework
                        plugIn = new
                            PlugIn((PluginNotation_NET1_1.ICalcPlugin)Activator.CreateInstance(ObjType), Host);
                    }

                    // удалось привести - добавляем новый плагин в коллекцию
                    plugInsCollection.Add(plugIn);
                }
              
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Exception", MessageBoxButtons.OK,
                    MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
            }
        }


Это сообщение отредактировал(а) marcusmae - 14.10.2006, 20:18


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
DarkDragon
Дата 15.10.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



А как выгрузить загруженную сборку, со всеми полученными типами методом GetExportedTypes()?

Не сильно помогает:
Код

   asm = null;
   types = null;
   GC.Collect();


Желательно для VS.NET 2003 (Framework v1.1)?

PM MAIL   Вверх
mr.DUDA
Дата 16.10.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(DarkDragon @  15.10.2006,  23:56 Найти цитируемый пост)
А как выгрузить загруженную сборку, со всеми полученными типами методом GetExportedTypes()?

Загруженную сборку выгрузить нельзя. Это ограничение .NET

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


--------------------
user posted image
PM MAIL WWW   Вверх
DarkDragon
Дата 16.10.2006, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



mr.DUDA, спасибо!
PM MAIL   Вверх
Exception
Дата 17.10.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Вот забавно-то будет иметь ссылку на тип из выгруженной сборки..
PM   Вверх
arilou
Дата 17.10.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Цитата(Exception @  17.10.2006,  00:30 Найти цитируемый пост)
Вот забавно-то будет иметь ссылку на тип из выгруженной сборки.. 

Не получится. Если попробуешь выгрузить AppDomain, на инфу из которого есть ссылки, произойдет исключение.



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Exception
Дата 17.10.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Да я собственно и не тешил себя надеждами, что CLR безвозмездно позволит мне так надругаться smile .
PM   Вверх
bus
Дата 17.10.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



А примеров работающих нет ни у кого? А то я не особо врубаюсь в эту дискуссию  smile 
PM MAIL   Вверх
arilou
Дата 18.10.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



bus, сделай поиск по форуму. Эта тема обсуждалась уже много раз.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1399 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.