Ejemplo n.º 1
0
        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");
            }
        }
Ejemplo n.º 2
0
 /// <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);
 }
Ejemplo n.º 3
0
 public CompositePlugin(IEnumerable <IPlugin> plugins, Logging.IPALogger logger)
 {
     this.plugins = plugins;
     this.logger  = logger;
 }
Ejemplo n.º 4
0
        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);
        }