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