А откуда Type.EmptyTypes? Там же два параметра в сигнатуре, с типами object и System.IntPtr.
Только потом с динамической генерацией аккуратнее. Для вызовов конструкторов делегатов более строгие правила верификации (описано в Ecma-335).
N>А откуда Type.EmptyTypes? Там же два параметра в сигнатуре, с типами object и System.IntPtr. N>Только потом с динамической генерацией аккуратнее. Для вызовов конструкторов делегатов более строгие правила верификации (описано в Ecma-335).
Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).
А в стандарте Ecma-335 описано почти все то же, как в MSDN.
Здравствуйте, AndrewStrelkov, Вы писали:
AS>Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).
Вызывать всё же надо с двумя параметрами, согласно сигнатуре конструктора...
Перед этим загрузив в стек null если передаваемый делегату метод является статическим, или ссылку на инстанс, если передаётся метод экземпляра, а потом уже загрузив в стек указатель на сам метод...
У меня создалось
AS>Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).
У конструктора два параметра. Поэтому надо передавать массив из двух типов (а не из нуля или одного).
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, AndrewStrelkov, Вы писали:
AS>>Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).
П>Вызывать всё же надо с двумя параметрами, согласно сигнатуре конструктора... П>
П>Перед этим загрузив в стек null если передаваемый делегату метод является статическим, или ссылку на инстанс, если передаётся метод экземпляра, а потом уже загрузив в стек указатель на сам метод... П>У меня создалось
Вот как у меня собсвенно, все выглядит:
dynMenuConstructorGetIL.Emit(OpCodes.Ldarg_0);
foreach (MethodBuilder m in methodsStorage)
{
if ("call_" + ((MethodInfo)root.Tag).Name.ToString() == m.Name.ToString())
{
dynMenuConstructorGetIL.Emit(OpCodes.Ldftn, m);
break;
}
}
dynMenuConstructorGetIL.Emit(OpCodes.Newobj, typeof(Delegate).GetConstructor(new Type[] {typeof(object), typeof(IntPtr)}));
Вначале передаю ссылку на this, потом загружаю указатель на метод и только потом уже вызываю конструктор делегата.
AS>>Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).
N>У конструктора два параметра. Поэтому надо передавать массив из двух типов (а не из нуля или одного).
Разными способами уже старался. Но все равно выбрасывается исключение.
Здравствуйте, AndrewStrelkov, Вы писали:
AS>Здравствуйте, Пельмешко, Вы писали:
П>>Здравствуйте, AndrewStrelkov, Вы писали:
AS>>>Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ 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 .
Чтоб меня, спасибо всем за советы!
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, AndrewStrelkov, Вы писали:
AS>>Разными способами уже старался. Но все равно выбрасывается исключение.
П>