Ejemplo n.º 1
0
        internal static Assembly Scan(string requested_name)
        {
            LemonEnumerator <SearchDirectoryInfo> enumerator = new LemonEnumerator <SearchDirectoryInfo>(SearchDirectoryList);

            while (enumerator.MoveNext())
            {
                string folderpath = enumerator.Current.Path;

                string filepath = Directory.GetFiles(folderpath).Where(x =>
                                                                       !string.IsNullOrEmpty(x) &&
                                                                       Path.GetExtension(x).ToLowerInvariant().Equals(".dll") &&
                                                                       Path.GetFileName(x).Equals($"{requested_name}.dll")
                                                                       ).FirstOrDefault();

                if (string.IsNullOrEmpty(filepath))
                {
                    continue;
                }

                IntPtr assemblyptr = MonoLibrary.Instance.mono_assembly_open_full(Marshal.StringToHGlobalAnsi(filepath), IntPtr.Zero, false);
                if (assemblyptr == IntPtr.Zero)
                {
                    continue;
                }

                IntPtr assemblyReflectionPtr = MonoLibrary.Instance.mono_assembly_get_object(MonoLibrary.GetRootDomainPtr(), assemblyptr);

                return(MonoLibrary.CastManagedAssemblyPtr(assemblyReflectionPtr));
            }

            return(null);
        }
        private static MelonLogger.Instance FindMelon(Predicate <MelonBase> criterion)
        {
            MelonLogger.Instance loggerInstance = null;

            LemonEnumerator <MelonPlugin> PluginEnumerator = new LemonEnumerator <MelonPlugin>(MelonHandler._Plugins.ToArray());

            while (PluginEnumerator.MoveNext())
            {
                if (criterion(PluginEnumerator.Current))
                {
                    loggerInstance = PluginEnumerator.Current.LoggerInstance;
                    break;
                }
            }

            if (loggerInstance == null)
            {
                LemonEnumerator <MelonMod> ModEnumerator = new LemonEnumerator <MelonMod>(MelonHandler._Mods.ToArray());
                while (ModEnumerator.MoveNext())
                {
                    if (criterion(ModEnumerator.Current))
                    {
                        loggerInstance = ModEnumerator.Current.LoggerInstance;
                        break;
                    }
                }
            }

            return(loggerInstance);
        }