The .Invoke methods (including DynamicInvoke) have an undesirable behavior: when running directly in the CLR (as opposed to within Visual Studio), if an application throws an exception in the context of a .Invoke, the .Invoke catches the exception (no matter what kind) and then rethrows it as the inner exception of a System.Reflection.TargetInvocationException, which will be unhandled and hence causes the application to terminate. If you attach a debugger at this point, the stack will have been unwound, hence you can obtain the line number at which your exception occured, and also the cause, but won't be able interrogate local variables or see the arguments to the methods that were called. To avoid this, cast to dynamic, as in: ((dynamic)Foo).Invoke(args)