Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 17:34   #1
Ustim
Пользователь
 
Регистрация: 04.03.2008
Сообщений: 12
Вопрос Подписаться на событие загруженной Assembly

Здравствуйте. Сколько не гуглил - никак не получается подписаться на событие загруженной сборки.

Сборка загружается вот так, всё работает:
Код:
AssemblyContent = Assembly.LoadFrom(AssemblyPath);
Type typeContent = AssemblyContent.GetType(ClassName);
typeContent.InvokeMember("Main", BindingFlags.Public |
                        BindingFlags.InvokeMethod | BindingFlags.Static, null, null, null);
теперь добавляем подписку на евент:
Код:
AssemblyContent = Assembly.LoadFrom(AssemblyPath);
Type typeContent = AssemblyContent.GetType(ClassName);
WireUp(typeContent, "RestartNeededEvent", "FireRestartEvent");
typeContent.InvokeMember("Main", BindingFlags.Public |
                        BindingFlags.InvokeMethod | BindingFlags.Static, null, null, null);
Ф-я WireUp, подсмотрел не помню уже где
Код:
void WireUp(object o, string eventname, string methodname)
{
            EventInfo ei = (o as Type).GetEvent(eventname);

            MethodInfo mi = this.GetType().GetMethod(methodname, BindingFlags.Public | BindingFlags.NonPublic);

            Delegate del = Delegate.CreateDelegate(ei.EventHandlerType, this, methodname);

            ei.AddEventHandler(o, del);
}
На строке с созданием делегата вылазит эксепшн с сообщением "Ошибка при связывании с конечным методом".
Пробовал делать статичным метод, к которому делегат привязываю, не помогает.
Везде что не находил всё советуют примерно по такому-же принципу. но в чём загвоздка - не пойму...
Помогите разобраться пожалуйста.
Создание качественных сайтов любой сложности -http://arte.dp.ua
Ustim вне форума Ответить с цитированием
Старый 10.06.2011, 19:54   #2
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

А экземпляр класса кто создавать будет? (класса ClassName)
Код:
Activator.CreateInstance(typeContent);
На созданном экземпляре уже есть смысл на что-то пытаться подписываться.
Spawn™Production® вне форума Ответить с цитированием
Старый 10.06.2011, 19:56   #3
Spawn™Production®
Форумчанин
 
Аватар для Spawn™Production®
 
Регистрация: 06.05.2011
Сообщений: 287
По умолчанию

Делегаты совпадают, кстати? В сборке и в текущем типе?
Spawn™Production® вне форума Ответить с цитированием
Старый 15.06.2011, 01:51   #4
Ustim
Пользователь
 
Регистрация: 04.03.2008
Сообщений: 12
По умолчанию

Спасибо за ответ. С той проблемой разобрался, появилась новая=)

Опишу по подробней что к чему:
Есть простая программка с формой и одной кнопочкой, запускающей евент.

Вот почти всё, что в ней есть:

Код:
public event EventHandler RestartNeededEvent;

public Form1()
{
	InitializeComponent();
}
private void button1_Click(object sender, System.EventArgs e)
{
        FireRestartNeededEvent();
	MessageBox.Show("Рас-рас....");
}
public void FireRestartNeededEvent()
{
        EventHandler handler = RestartNeededEvent;
        if (handler != null)
            handler(this, null);
}
Её загружает другая программулина и пытается подписаться на событие RestartNeededEvent.

Вот кусочек кода класса, пытающегося это делать:

Код:
public event EventHandler RestartNeeded;
public void Initialize()
{
    AssemblyContent = Assembly.LoadFrom(AssemblyPath);
    if (AssemblyContent != null)
    {                
        Type typeContent = AssemblyContent.GetType(ClassName);
        object o = Activator.CreateInstance(typeContent);
        try
        {
               WireUp(o, "RestartNeededEvent", "FireRestartEvent");

               o.GetType().InvokeMember("Main", BindingFlags.Public |
                        BindingFlags.InvokeMethod | BindingFlags.Static, null, null, null);
        }
        catch (Exception e)
        {
        }
    }
}
void WireUp(object o, string eventname, string methodname)
{
    EventInfo ei = o.GetType().GetEvent(eventname);
    MethodInfo mi = this.GetType().GetMethod(methodname, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
    EventHandler del = (EventHandler)Delegate.CreateDelegate(ei.EventHandlerType, this, mi);
    ei.AddEventHandler(o, del);
}

public void FireRestartEvent(object sender, EventArgs e)
{
    EventHandler handler = RestartNeeded;
    if (handler != null)
         handler(this, null);
}
Получается, у программулины есть свой евент, который я хочу запускать как только произойдёт евент у загруженной сборки.

Так вот, в чём суть. У загружаемой сборки, в функции FireRestartNeededEvent handler всегда равен null, буд-то никто не подписывался. Или я что-то неправильно понимаю?
Создание качественных сайтов любой сложности -http://arte.dp.ua
Ustim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск и замена в HTML-коде страницы загруженной в TWebBrowser iiunbreakableii Общие вопросы Delphi 4 01.01.2011 07:54
Подписаться на событие другого класса boris-blade Общие вопросы .NET 1 06.04.2010 22:53
Could not load file or assembly... Stilet Общие вопросы .NET 3 08.02.2010 18:03
как получить доступ к тексту внутри JS на загруженной странице element Работа с сетью в Delphi 0 11.01.2008 23:19