#pragma once #include #include #include #include #include "il2cpp-class.h" #include "Il2CppOffsets.h" #include "il2cpp-metadata.h" #include "il2cpp-tabledefs.h" #include "il2cpp-api-types.h" class Il2CppApi { public: // Type system API static Il2CppClass* GetTypeInfoFromTypeDefinitionIndex(TypeDefinitionIndex index); static const char* ClassGetNamespace(Il2CppClass* klass); static const char* ClassGetName(Il2CppClass* klass); static bool ClassIsEnum(const Il2CppClass* klass); static bool ClassIsValueType(const Il2CppClass* klass); static int ClassGetFlags(const Il2CppClass* klass); static Il2CppClass* ClassGetParent(Il2CppClass* klass); static const Il2CppType* ClassGetType(Il2CppClass* klass); static Il2CppClass* ClassFromName(const Il2CppImage* image, const char* namespaze, const char* name); static bool ClassInit(Il2CppClass* klass); // Method API static const uint8_t* ClassGetMethods(Il2CppClass* klass, void* iter); static const char* MethodGetName(const uint8_t* MethodPtr); static const Il2CppType* MethodGetReturnType(const uint8_t* method); static const uint32_t MethodGetParamCount(const uint8_t* method); static const Il2CppType* MethodGetParam(const uint8_t* method, uint32_t index); static const char* MethodGetParamName(const uint8_t* method, uint32_t index); static const uintptr_t* ClassGetMethodFromName(Il2CppClass* klass, const char* name, int argsCount); static std::string GetMethodModifier(uint32_t flags); // Field API static uintptr_t* ClassGetFields(Il2CppClass* klass, void** iter); static int FieldGetFlags(uintptr_t* field); static const Il2CppType* FieldGetType(uintptr_t* field); static const char* FieldGetName(uintptr_t* field); static void FieldStaticGetValue(uintptr_t* field, void* value); static size_t FieldStaticGetValue(uintptr_t* field); static bool FieldIsInstance(uintptr_t* field); static size_t FieldGetOffset(uintptr_t* field); static uint32_t FieldGetToken(uintptr_t* field); // Generic type API static const void* ObjectUnbox(Il2CppObject* obj); static const size_t* ClassGetInterfaces(const uint8_t* klass, size_t& count); static const Il2CppGenericContainer* GenericClassGetGenericContainer(const Il2CppGenericClass* generic_class); static const Il2CppGenericClass* ClassGetGenericClass(const Il2CppClass* klass); static uint32_t ClassGetGenericArgCount(const Il2CppClass* klass); static const void* ClassGetGenericArgType(const Il2CppClass* klass, uint64_t index); static bool ClassIsGeneric(const Il2CppClass* klass); // Type and reflection API static char* TypeGetName(const Il2CppType* type); static Il2CppClass* FromIl2CppType(const Il2CppType* type); // Runtime API static const uintptr_t* RuntimeClassInit(); static Il2CppDomain* DomainGet(); static Il2CppObject* MethodInvoke(const uintptr_t* method, void* obj, void** params); static Il2CppAssembly** DomainGetAssemblies(size_t* size); static const Il2CppAssembly* DomainAssemblyOpen(const char* name); static const Il2CppImage* AssemblyGetImage(const Il2CppAssembly* assembly); static const char* AssemblyGetName(const Il2CppAssembly* assembly); static Il2CppClass* ObjectGetClass(Il2CppObject* obj); static uint32_t ImageGetClassCount(const Il2CppImage* image); static Il2CppThread* ThreadAttach(Il2CppDomain* domain); static Il2CppArray* ArrayNew(Il2CppClass* elementTypeInfo, il2cpp_array_size_t length); static Il2CppObject* ObjectNew(Il2CppClass* klass); static void GCDisable(); static Il2CppClass* ImageGetClass(const Il2CppImage* image, size_t index); private: template static auto RemoteFuncCall(uintptr_t offset) { using FuncType = ReturnType(*)(Args...); return reinterpret_cast(offset + il2CppOffsets::gIBaseAddress); } };