internal IntPtr InvokeObjectArrayDelegate(object[] arguments) { if (!_conversionInfo.IsObjectArrayDelegateThunk) { Environment.FailFast("Thunk is not an object array delegate thunk!"); } Debug.Assert(!_delegateData.Equals(default(DelegateData))); Func <object[], object> targetDelegate = _delegateData._helperObject as Func <object[], object>; Debug.Assert(targetDelegate != null); object result = targetDelegate(arguments ?? Array.Empty <object>()); TypeHandle thArgType; bool forceByRefUnused; _calleeArgs.GetReturnType(out thArgType, out forceByRefUnused); Debug.Assert(!thArgType.IsNull()); unsafe { if (thArgType.IsValueType() && thArgType.GetRuntimeTypeHandle().ToEETypePtr()->IsNullable) { object nullableObj = RuntimeAugments.RawNewObject(thArgType.GetRuntimeTypeHandle()); s_pinnedGCHandles._returnObjectHandle.Target = nullableObj; if (result != null) { RuntimeAugments.StoreValueTypeField(ref RuntimeAugments.GetRawData(nullableObj), result, thArgType.GetRuntimeTypeHandle()); } } else { s_pinnedGCHandles._returnObjectHandle.Target = result; } } return(s_pinnedGCHandles._returnObjectHandle.GetRawTargetAddress()); }