private unsafe object?Invoke(object?obj, IntPtr *args, BindingFlags invokeAttr) { if (!_strategyDetermined) { if (!_invoked) { // The first time, ignoring race conditions, use the slow path. _invoked = true; } else { if (RuntimeFeature.IsDynamicCodeCompiled) { _invokeFunc = InvokerEmitUtil.CreateInvokeDelegate(_method); } _strategyDetermined = true; } } object?ret; if ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { try { // For the rarely used scenario of calling the constructor directly through MethodBase.Invoke() // with a non-null 'obj', we use the slow path to avoid having two emit-based delegates. if (_invokeFunc != null && obj == null) { ret = _invokeFunc(target: null, args); } else { ret = InterpretedInvoke(obj, args); } } catch (Exception e) { throw new TargetInvocationException(e); } } else if (_invokeFunc != null && obj == null) { ret = _invokeFunc(target: null, args); } else { ret = InterpretedInvoke(obj, args); } return(ret); }
private unsafe object?Invoke(object?obj, IntPtr *args, BindingFlags invokeAttr) { if (!_strategyDetermined) { if (!_invoked) { // The first time, ignoring race conditions, use the slow path. _invoked = true; } else { if (RuntimeFeature.IsDynamicCodeCompiled) { _invokeFunc = InvokerEmitUtil.CreateInvokeDelegate(_method); } _strategyDetermined = true; } } object?ret; if ((invokeAttr & BindingFlags.DoNotWrapExceptions) == 0) { try { if (_invokeFunc != null) { ret = _invokeFunc(obj, args); } else { ret = InterpretedInvoke(obj, args); } } catch (Exception e) { throw new TargetInvocationException(e); } } else if (_invokeFunc != null) { ret = _invokeFunc(obj, args); } else { ret = InterpretedInvoke(obj, args); } return(ret); }