The docs for both DynamicInvoke and DynamicInvokeImpl say:
Dynamically invokes (late-bound) the method represented by the current delegate.
I notice that DynamicInvoke and DynamicInvokeImpl take an array of objects instead of a specific list of arguments (which is the late-bound part I'm guessing). But is that the only difference? And what is the difference between DynamicInvoke and DynamicInvokeImpl.
The main difference between calling it directly (which is short-hand for
Invoke(...)
) and usingDynamicInvoke
is performance; a factor of more than *700 by my measure (below).With the direct/
Invoke
approach, the arguments are already pre-validated via the method signature, and the code already exists to pass those into the method directly (I would say "as IL", but I seem to recall that the runtime provides this directly, without any IL). WithDynamicInvoke
it needs to check them from the array via reflection (i.e. are they all appropriate for this call; do they need unboxing, etc); this is slow (if you are using it in a tight loop), and should be avoided where possible.Example; results first (I increased the
LOOP
count from the previous edit, to give a sensible comparison):With code:
Coincidentally I have found another difference.
If
Invoke
throws an exception it can be caught by the expected exception type. HoweverDynamicInvoke
throws aTargetInvokationException
. Here is a small demo:While the second test goes green, the first one faces a TargetInvokationException.
Really there is no functional difference between the two. if you pull up the implementation in reflector, you'll notice that DynamicInvoke just calls DynamicInvokeImpl with the same set of arguments. No extra validation is done and it's a non-virtual method so there is no chance for it's behavior to be changed by a derived class. DynamicInvokeImpl is a virtual method where all of the actual work is done.