From 369adf7c470cdb4f1497dbe5fb6ea6ce43d099e2 Mon Sep 17 00:00:00 2001 From: Royston1999 <56835953+Royston1999@users.noreply.github.com> Date: Fri, 23 May 2025 16:14:45 +0100 Subject: [PATCH] fix instance delegates these have literally never worked due to a bug in the template types --- shared/delegate.hpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/shared/delegate.hpp b/shared/delegate.hpp index ac47d43..19255e2 100644 --- a/shared/delegate.hpp +++ b/shared/delegate.hpp @@ -501,8 +501,8 @@ struct DelegateWrapperInstance : Il2CppObject { return 0; } Il2CppMethodPointer methodPointer() const override { - static auto mptr = &DelegateWrapperInstance::dtor; - return reinterpret_cast(+[](DelegateWrapperInstance* inst) { (inst->*mptr)(); }); + static auto mptr = &___TargetType::dtor; + return reinterpret_cast(+[](___TargetType* inst) { (inst->*mptr)(); }); } InvokerMethod invoker() const override { return &::custom_types::invoker_creator::invoke; @@ -626,6 +626,12 @@ template T MakeDelegate(const Il2CppClass* delegateClass, DelegateWrapperInstance* inst) { custom_types::logger.debug("Delegate instance dtor registrator: {}", fmt::ptr(DelegateWrapperInstance::___dtor_MethodRegistrator.get())); + auto* delegate = reinterpret_cast(il2cpp_functions::object_new(delegateClass)); + // find the ctor method that takes object, intptr + const MethodInfo* ctor_minfo = THROW_UNLESS( + il2cpp_utils::FindMethod(const_cast(delegateClass), ".ctor", std::array{}, + std::array{ il2cpp_utils::il2cpp_type_check::il2cpp_no_arg_type::get(), &il2cpp_functions::defaults->int_class->this_arg })); + // find the invoke method const MethodInfo* invoke_minfo; auto methodSpan = std::span(delegateClass->methods, delegateClass->method_count); @@ -639,16 +645,13 @@ T MakeDelegate(const Il2CppClass* delegateClass, DelegateWrapperInstancehas_full_generic_sharing_signature) { + // boxed method = DelegateWrapperInstance::___Invoke_MethodRegistrator.get(); } else { + // unboxed method = DelegateWrapperInstance::___InvokeUnboxed_MethodRegistrator.get(); } - auto* delegate = reinterpret_cast(il2cpp_functions::object_new(delegateClass)); - // find the ctor method that takes object, intptr - auto ctor_minfo = THROW_UNLESS( - il2cpp_utils::FindMethod(const_cast(delegateClass), ".ctor", std::array{}, - std::array{ il2cpp_utils::il2cpp_type_check::il2cpp_no_arg_type::get(), &il2cpp_functions::defaults->int_class->this_arg })); CRASH_UNLESS(il2cpp_utils::RunMethodOpt(delegate, ctor_minfo, inst, (void*)&method)); if (invoke_minfo->has_full_generic_sharing_signature) {