Здравствуйте, nikov, Вы писали:
N>Здравствуйте, AndrewStrelkov, Вы писали:
AS>>AS>>IL_001d: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
AS>>
AS>>Нужно повторить это в динамической генерации кода. Но так как делегат нельзя создать, просто написав
AS>>AS>>(OpCodes.Newobj, typeof(EventHandler).GetConstructor(Type.EmptyTypes))
AS>>
N>А откуда Type.EmptyTypes? Там же два параметра в сигнатуре, с типами object и System.IntPtr.
N>Только потом с динамической генерацией аккуратнее. Для вызовов конструкторов делегатов более строгие правила верификации (описано в Ecma-335).
Все правильно, в делегат передается указатель на функцию по сигнатуре. Вызов с параметром конструктора Type.EmtyTypes создает делегат без указателя, и это правильно вызывает исключение NullReferenceException. Но такое же исключение возникает при вызове с параметрами (new Type[]{ typeof(IntPtr)}).
А в стандарте Ecma-335 описано почти все то же, как в MSDN.