Re[2]: Делегаты в MSIL
От: AndrewStrelkov  
Дата: 20.02.09 15:23
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.