I\'m writing a \"weak event factory\" - code which converts any Delegate into a new delegate with an identical signature, but with implementing a WeakReference on the target
Use Call, not Callvirt.
[Edit: Not as a general recommendation, but specifically to address this issue]
Callvirt is for calling virtual methods, where the destination address also depends upon the exact type of the instance. That doesn't work when you're using a weak reference.
The target of a private method, on the other hand, can be determined at compile-time. It is therefore appropriate to invoke it using Call.