Re[5]: Делегаты в MSIL
От: AndrewStrelkov  
Дата: 20.02.09 16:21
Оценка:
Здравствуйте, AndrewStrelkov, Вы писали:

AS>Здравствуйте, Пельмешко, Вы писали:


П>>Здравствуйте, AndrewStrelkov, Вы писали:


AS>>>Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).


П>>Вызывать всё же надо с двумя параметрами, согласно сигнатуре конструктора...

П>>
П>>gen.Emit(OpCodes.Newobj, typeof( EventHandler ).GetConstructor( new[] { typeof( object ), typeof( IntPtr ) } ));
П>>

П>>Перед этим загрузив в стек null если передаваемый делегату метод является статическим, или ссылку на инстанс, если передаётся метод экземпляра, а потом уже загрузив в стек указатель на сам метод...
П>>У меня создалось

AS>Вот как у меня собсвенно, все выглядит:


AS>
AS>dynMenuConstructorGetIL.Emit(OpCodes.Ldarg_0);
AS>foreach (MethodBuilder m in methodsStorage)
AS>{
AS>    if ("call_" + ((MethodInfo)root.Tag).Name.ToString() == m.Name.ToString())
AS>    {
AS>        dynMenuConstructorGetIL.Emit(OpCodes.Ldftn, m);
AS>        break;
AS>    }
AS>}
AS>dynMenuConstructorGetIL.Emit(OpCodes.Newobj, typeof(Delegate).GetConstructor(new Type[] {typeof(object), typeof(IntPtr)}));
AS>


AS>Вначале передаю ссылку на this, потом загружаю указатель на метод и только потом уже вызываю конструктор делегата.


Вопрос отпал, я и сам не заметил, что пытаюсь вызвать конструктор Delegate, а не EventHandler .
Чтоб меня, спасибо всем за советы!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.