Как работает делегат .Invoke?
Если я создам делегат в своем коде, например:
delegate void dostuff (string o);
Это генерирует класс, полученный из System.MulticastDelegate
, который реализует три метода: Invoke
, BeginInvoke
и EndInvoke
.
Если я посмотрю на скомпилированный IL для Invoke
, я вижу следующее:
.method public hidebysig newslot virtual
instance void Invoke(string o) runtime managed
{
} // end of method dostuff::Invoke
Метод не содержит кода. Вызов его действительно работает - делегат вызывается, но я не вижу, как он это делает.
Где вуду, вызывающий вызов Invoke, фактически вызывает делегат?
Ответы
Ответ 1
Вуду можно найти в конце подписи: runtime managed
. Обратите внимание, что все ваши управляемые классы и методы, которые вы определяете, будут оформлены как cli managed
.
runtime managed
означает, что среда выполнения обеспечивает предварительно оптимизированные реализации методов.