public static IntPtr GetIl2CppClass(string assemblyName, string namespaze, string className) { if (!ourImagesMap.TryGetValue(assemblyName, out var image)) { LogSupport.Error($"Assembly {assemblyName} is not registered in il2cpp"); return(IntPtr.Zero); } var clazz = il2cpp_class_from_name(image, namespaze, className); return(clazz); }
public static IntPtr GetIl2CppField(IntPtr clazz, string fieldName) { if (clazz == IntPtr.Zero) { return(IntPtr.Zero); } var field = il2cpp_class_get_field_from_name(clazz, fieldName); if (field == IntPtr.Zero) { LogSupport.Error($"Field {fieldName} was not found on class {Marshal.PtrToStringAnsi(il2cpp_class_get_name(clazz))}"); } return(field); }
static IL2CPP() { var domain = il2cpp_domain_get(); if (domain == IntPtr.Zero) { LogSupport.Error("No il2cpp domain found; sad!"); return; } uint assembliesCount = 0; var assemblies = il2cpp_domain_get_assemblies(domain, ref assembliesCount); for (var i = 0; i < assembliesCount; i++) { var image = il2cpp_assembly_get_image(assemblies[i]); var name = Marshal.PtrToStringAnsi(il2cpp_image_get_name(image)); ourImagesMap[name] = image; } }
public static IntPtr GetIl2CppNestedType(IntPtr enclosingType, string nestedTypeName) { if (enclosingType == IntPtr.Zero) { return(IntPtr.Zero); } IntPtr iter = IntPtr.Zero; IntPtr nestedTypePtr; if (il2cpp_class_is_inflated(enclosingType)) { LogSupport.Trace("Original class was inflated, falling back to reflection"); if (GetNestedTypeViaReflection == null) { // todo: clean up this ugly reflection hack GetNestedTypeViaReflection = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(it => it.GetName().Name == "UnhollowerRuntimeLib") ?.GetType("UnhollowerRuntimeLib.RuntimeReflectionHelper") ?.GetMethod("GetNestedTypeViaReflection", BindingFlags.Static | BindingFlags.Public)?.CreateDelegate(typeof(Func <IntPtr, string, IntPtr>)) as Func <IntPtr, string, IntPtr>; } var result = GetNestedTypeViaReflection?.Invoke(enclosingType, nestedTypeName); if (result != null) { return(result.Value); } } while ((nestedTypePtr = il2cpp_class_get_nested_types(enclosingType, ref iter)) != IntPtr.Zero) { if (Marshal.PtrToStringAnsi(il2cpp_class_get_name(nestedTypePtr)) == nestedTypeName) { return(nestedTypePtr); } } LogSupport.Error($"Nested type {nestedTypeName} on {Marshal.PtrToStringAnsi(il2cpp_class_get_name(enclosingType))} not found!"); return(IntPtr.Zero); }