Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Можно ли вешать событие на вызов любого метода?


Автор: Bogdan1024 5.11.2008, 20:21
Вопрос теоретический, поэтому не закидывайте меня кодом и ссылками, а просто объясните вкратцэ smile
Можно ли каким-нибудь образом повесить на любой метод событие, которое будет вызываться когда этот метод будет вызываться?

Автор: Partizan 5.11.2008, 20:33
Bogdan1024, 

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

Автор: mr.DUDA 5.11.2008, 20:40
Такой возможности нет. Вот почему:

Генерировать событие до или после тела метода? Куда девать аргументы метода, передавать в событие или нет, создавать фрейм стека или нет (до или после)? Отменить вызов метода, если событие захочет этого? Как обрабатывать исключения в коде обработчика события?

P.S. по сабжу было что-то по поводу контекстов, но было это давно и для .NET 1.0/1.1, уже не вспомню  smile 

Автор: Bogdan1024 5.11.2008, 20:52
Цитата(Partizan @  5.11.2008,  19:33 Найти цитируемый пост)
имеется ввиду возможность установить генерируемое событие для всех методов из одного места?

Это было бы неплохо smile
Цитата(Partizan @  5.11.2008,  19:33 Найти цитируемый пост)
или возможность генерирования события в любом гипотетически возможном методе? 

Это интересует smile
Цитата(mr.DUDA @  5.11.2008,  19:40 Найти цитируемый пост)
Генерировать событие до или после тела метода? Куда девать аргументы метода, передавать в событие или нет, создавать фрейм стека или нет (до или после)? Отменить вызов метода, если событие захочет этого? Как обрабатывать исключения в коде обработчика события?

Я не знаю куда, может микрософтовцы знают smile Может нужно задифайнить одну константу и фрэймворк начнёт работать по-другому smile 
Ведь мы же можем ставить брэйкпойнты где угодно в приложениях, даже в самом бинарнике (экзешнике). Может быть фрэймворк имеет методы, которые позволяют делать что-то подобное: дико контролировать исполнение приложения? 
Я не работал с MSIL-отладчиком. 
Просто мне кажется что когда что-то доходит до брэйкпойнта, то генерируется событие.

Добавлено через 6 минут и 49 секунд
Не, я понимаю что со стеком ничего не происходит на брэйкпойнтах. Но всё же... smile 
Можно ли просто следить за выполнением программы и создавать события при вызове некоторых методов в другой?

Автор: mr.DUDA 5.11.2008, 21:01
Цитата(Bogdan1024 @  5.11.2008,  20:52 Найти цитируемый пост)
Ведь мы же можем ставить брэйкпойнты где угодно в приложениях, даже в самом бинарнике (экзешнике). Может быть фрэймворк имеет методы, которые позволяют делать что-то подобное: дико контролировать исполнение приложения? 

Что позволено дебаггеру, то не позволено.... хмм... простому смертному  smile 

У дебаггера есть PDB-файл с полной инфой об адресе каждого метода, вот он и рулит, и вообще дебаггер CLR не написан на c#/.net, а только подвид обычного сишного студийного дебаггера с его набором инструментов. У программера есть прямые руки и возможность воткнуть в начало нужного метода вызов статического метода а-ля MyEvent.Raise("message") и т.п.

Добавлено через 1 минуту и 33 секунды
Цитата(Bogdan1024 @  5.11.2008,  20:52 Найти цитируемый пост)
Не, я понимаю что со стеком ничего не происходит на брэйкпойнтах. Но всё же...  Можно ли просто следить за выполнением программы и создавать события при вызове некоторых методов в другой?

см. "прямые руки" и так далее  smile 

Автор: Bogdan1024 5.11.2008, 21:06
Всё ясно smile Когда врублюсь в MSIL по-лучше, тогда возможно вернусь к этой теме. А пока что считаю её закрытой smile Всем учасникам спасибо smile

Автор: Rififi 5.11.2008, 21:13
Цитата(Bogdan1024 @  5.11.2008,  21:21 Найти цитируемый пост)
Можно ли каким-нибудь образом повесить на любой метод событие, которое будет вызываться когда этот метод будет вызываться? 

можно.
смотреть в сторону http://aspectdotnet.org/ и других AOP-библиотек

Автор: jorikdima 6.11.2008, 12:10
Цитата(Rififi @ 5.11.2008,  21:13)
Цитата(Bogdan1024 @  5.11.2008,  21:21 Найти цитируемый пост)
Можно ли каким-нибудь образом повесить на любой метод событие, которое будет вызываться когда этот метод будет вызываться? 

можно.
смотреть в сторону http://aspectdotnet.org/ и других AOP-библиотек

В Питере сделано  smile  smile  smile 

Автор: Jamon 7.11.2008, 20:35
Цитата(Rififi @ 5.11.2008,  21:13)
Цитата(Bogdan1024 @  5.11.2008,  21:21 Найти цитируемый пост)
Можно ли каким-нибудь образом повесить на любой метод событие, которое будет вызываться когда этот метод будет вызываться? 

можно.
смотреть в сторону http://aspectdotnet.org/ и других AOP-библиотек

+1.
Если вкратце - то аспекты помогают по определенному принципу выбрать методы, при всех вызовах которых нужно что-то делать. Ну, например вызывать метод логирования инфы - чтобы не писать однотипные строчки в n методах, можно написать аспект, который выберет методы и runtime впихнет нужный код. 

для лучшего понимания конечно юзайте документацию, но я когда заинтересовался - мне почему то лучше всего помогла статья про аспекты в php smile  -  с моей т.зр. было явно лучше и понятней написано чем в статьях, опирающихся на c#/java либы, может конечно не те доки читал  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)