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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2009, 13:37   #1
Андрей Стрелков
 
Регистрация: 20.02.2009
Сообщений: 4
Вопрос Делегаты в MSIL

Всем доброго времени суток.
Разбирая код IL натолкнулся на следующую строку:

IL_001d: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)

Нужно повторить это в динамической генерации кода. Но так как делегат нельзя создать, просто написав (OpCodes.Newobj, typeof(EventHandler).GetConstructor (Type.EmptyTypes)), то тут возникла серьезная проблема. Буду благодарен, если кто сможет разъяснить, в чем моя ошибка и как все-таки создать делегат.
Андрей Стрелков вне форума Ответить с цитированием
Старый 20.02.2009, 16:48   #2
Angelus Pitovius
 
Регистрация: 20.02.2009
Сообщений: 5
По умолчанию

Не очень понятно в чем проблема?
Emit(OpCodes.Newobj, typeof(EventHandler).GetConstructor (new Type[] {typeof(object), typeof(IntPtr) }))
Angelus Pitovius вне форума Ответить с цитированием
Старый 20.02.2009, 18:38   #3
Андрей Стрелков
 
Регистрация: 20.02.2009
Сообщений: 4
По умолчанию

NullReferenceException при таких параметрах вылетает. Перед этим вызовом на стек загружается указатель на функцию с правильной сигнатурой.
Андрей Стрелков вне форума Ответить с цитированием
Старый 20.02.2009, 18:49   #4
Angelus Pitovius
 
Регистрация: 20.02.2009
Сообщений: 5
По умолчанию

Где именно вылетает exception?
При выполнении сгенерированного кода? Тогда покажи весь emit целиком.

Цитата:
Перед этим вызовом на стек загружается указатель на функцию с правильной сигнатурой.
Ну как минимум нужно сначала this загрузить в стэк...

Последний раз редактировалось MaTBeu; 20.02.2009 в 19:01.
Angelus Pitovius вне форума Ответить с цитированием
Старый 20.02.2009, 19:02   #5
Андрей Стрелков
 
Регистрация: 20.02.2009
Сообщений: 4
По умолчанию

Весь Emit целиком?

Вот небольшая часть:
dynMenuConstructorGetIL.Emit(OpCode s.Ldarg_0);
foreach (MethodBuilder m in methodsStorage)
{
if ("call_" + ((MethodInfo)root.Tag).Name.ToStrin g() == m.Name.ToString())
{
dynMenuConstructorGetIL.Emit(OpCode s.Ldftn, m);
break;
}
}

dynMenuConstructorGetIL.Emit(OpCode s.Newobj, typeof(Delegate).GetConstructor(new Type[] {typeof(object), typeof(IntPtr)}));

Вот на последнем Emit'е и вылетает
Андрей Стрелков вне форума Ответить с цитированием
Старый 20.02.2009, 19:04   #6
Angelus Pitovius
 
Регистрация: 20.02.2009
Сообщений: 5
По умолчанию

Андрей, ну и чего ты хочешь? У типа Delegate нет такого конструктора. У него вообще нет никаких конструкторов...
Angelus Pitovius вне форума Ответить с цитированием
Старый 20.02.2009, 19:17   #7
Андрей Стрелков
 
Регистрация: 20.02.2009
Сообщений: 4
По умолчанию

действительно, что сказать.... Не заметил, что сам указал Delegate вместо EventHandler.
Ну чтож, премного благодарен, теперь действительно работает
Андрей Стрелков вне форума Ответить с цитированием
Ответ


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