internal static unsafe void InvokeWithVariantArgs(IntPtr delegateGCHandle, godot_variant **args, uint argc, godot_variant *outRet) { try { // TODO: Optimize var @delegate = (Delegate)GCHandle.FromIntPtr(delegateGCHandle).Target !; var managedArgs = new object?[argc]; var parameterInfos = @delegate.Method.GetParameters(); var paramsLength = parameterInfos.Length; if (argc != paramsLength) { throw new InvalidOperationException( $"The delegate expects {paramsLength} arguments, but received {argc}."); } for (uint i = 0; i < argc; i++) { managedArgs[i] = Marshaling.ConvertVariantToManagedObjectOfType( *args[i], parameterInfos[i].ParameterType); } object?invokeRet = @delegate.DynamicInvoke(managedArgs); *outRet = Marshaling.ConvertManagedObjectToVariant(invokeRet); } catch (Exception e) { ExceptionUtils.LogException(e); *outRet = default; } }