private static void LoadPlugins(Logging.IPALogger logger) { string pluginDirectory = Path.Combine(Environment.CurrentDirectory, "Plugins"); // Process.GetCurrentProcess().MainModule crashes the game and Assembly.GetEntryAssembly() is NULL, // so we need to resort to P/Invoke string exeName = Path.GetFileNameWithoutExtension(AppInfo.StartupPath); logger.Debug(exeName, "IPA"); _Plugins = new List <IPlugin>(); if (!Directory.Exists(pluginDirectory)) { return; } string[] files = Directory.GetFiles(pluginDirectory, "*.dll"); foreach (var s in files) { _Plugins.AddRange(LoadPluginsFromFile(Path.Combine(pluginDirectory, s), exeName, logger)); } // DEBUG logger.Debug($"Running on Unity {UnityEngine.Application.unityVersion}", "IPA"); logger.Debug($"Loading plugins from {pluginDirectory} and found {_Plugins.Count}", "IPA"); foreach (var plugin in _Plugins) { logger.Debug($"{plugin.Name}: {plugin.Version}", "IPA"); } }
/// <summary> /// Gets the list of loaded plugins and loads them if necessary. /// </summary> public static IEnumerable <IPlugin> GetPlugins(Logging.IPALogger logger) { if (_Plugins == null) { LoadPlugins(logger); } return(_Plugins); }
public CompositePlugin(IEnumerable <IPlugin> plugins, Logging.IPALogger logger) { this.plugins = plugins; this.logger = logger; }
private static IEnumerable <IPlugin> LoadPluginsFromFile(string file, string exeName, Logging.IPALogger logger) { List <IPlugin> plugins = new List <IPlugin>(); if (!File.Exists(file) || !file.EndsWith(".dll", true, null)) { return(plugins); } try { Assembly assembly = Assembly.LoadFrom(file); foreach (Type t in assembly.GetTypes()) { if (t.GetInterface("IPlugin") != null) { try { IPlugin pluginInstance = Activator.CreateInstance(t) as IPlugin; string[] filter = null; if (pluginInstance is IEnhancedPlugin) { filter = ((IEnhancedPlugin)pluginInstance).Filter; } if (filter == null || Enumerable.Contains(filter, exeName, StringComparer.OrdinalIgnoreCase)) { plugins.Add(pluginInstance); } } catch (Exception e) { logger.Warning($"Could not load plugin {t.FullName} in {Path.GetFileName(file)}. {e}", "IPA"); } } } } catch (Exception e) { logger.Error($"Could not load {Path.GetFileName(file)}. {e}", "IPA"); } return(plugins); }