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);
        }