private static void OnPluginReady(CorePlugin plugin) { if (PluginReady != null) { PluginReady(null, new CorePluginEventArgs(plugin)); } }
private static void UnloadPlugin(CorePlugin plugin) { disposedPlugins.Add(plugin.PluginAssembly); OnDiscardPluginData(new[] { plugin }); plugins.Remove(plugin.AssemblyName); try { plugin.Dispose(); } catch (Exception e) { Log.Core.WriteError("Error disposing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName); } }
private static void LoadPlugins() { UnloadPlugins(); Log.Core.Write("Scanning for core plugins..."); Log.Core.PushIndent(); if (Directory.Exists("Plugins")) { string[] pluginDllPaths = Directory.GetFiles("Plugins", "*.core.dll", SearchOption.AllDirectories); foreach (string dllPath in pluginDllPaths) { Log.Core.Write("{0}...", dllPath); Log.Core.PushIndent(); try { Assembly pluginAssembly; if (environment == ExecutionEnvironment.Launcher) { pluginAssembly = Assembly.LoadFrom(dllPath); } else { pluginAssembly = Assembly.Load(File.ReadAllBytes(dllPath)); } Type pluginType = pluginAssembly.GetExportedTypes().FirstOrDefault(t => typeof(CorePlugin).IsAssignableFrom(t)); if (pluginType == null) { Log.Core.WriteWarning("Can't find CorePlugin class. Discarding plugin..."); disposedPlugins.Add(pluginAssembly); continue; } CorePlugin plugin = (CorePlugin)pluginType.CreateInstanceOf(); plugins.Add(plugin.AssemblyName, plugin); } catch (Exception e) { Log.Core.WriteError("Error loading plugin: {0}", Log.Exception(e)); } Log.Core.PopIndent(); } } Log.Core.PopIndent(); }
public void BeforeTest(TestDetails details) { Console.WriteLine("----- Beginning Duality environment setup -----"); // Set environment directory to Duality binary directory this.oldEnvDir = Environment.CurrentDirectory; string codeBaseURI = typeof(DualityApp).Assembly.CodeBase; string codeBasePath = codeBaseURI.StartsWith("file:") ? codeBaseURI.Remove(0, "file:".Length) : codeBaseURI; codeBasePath = codeBasePath.TrimStart('/'); Environment.CurrentDirectory = Path.GetDirectoryName(codeBasePath); // Add some Console logs manually for NUnit if (!Log.Game.Outputs.OfType<ConsoleLogOutput>().Any()) { if (this.consoleLogOutput == null) this.consoleLogOutput = new ConsoleLogOutput(); Log.Game.AddOutput(this.consoleLogOutput); Log.Core.AddOutput(this.consoleLogOutput); Log.Editor.AddOutput(this.consoleLogOutput); } // Initialize Duality DualityApp.Init(DualityApp.ExecutionEnvironment.Launcher, DualityApp.ExecutionContext.Game); // Manually register pseudo-plugin for the Unit Testing Assembly this.unitTestPlugin = DualityApp.LoadPlugin(typeof(DualityTestsPlugin).Assembly, codeBasePath); // Create a dummy window, to get access to all the device contexts if (this.dummyWindow == null) { this.dummyWindow = new GameWindow(800, 600); this.dummyWindow.Context.LoadAll(); this.dummyWindow.Visible = true; this.dummyWindow.Context.Update(this.dummyWindow.WindowInfo); this.dummyWindow.MakeCurrent(); this.dummyWindow.ProcessEvents(); DualityApp.TargetResolution = new Vector2(this.dummyWindow.Width, this.dummyWindow.Height); DualityApp.TargetMode = this.dummyWindow.Context.GraphicsMode; ContentProvider.InitDefaultContent(); } // Load local testing memory TestHelper.LocalTestMemory = Formatter.TryReadObject<TestMemory>(TestHelper.LocalTestMemoryFilePath, FormattingMethod.Xml); Console.WriteLine("----- Duality environment setup complete -----"); }
public void BeforeTest(TestDetails details) { Console.WriteLine("----- Beginning Duality environment setup -----"); // Set environment directory to Duality binary directory this.oldEnvDir = Environment.CurrentDirectory; string codeBaseURI = typeof(DualityApp).Assembly.CodeBase; string codeBasePath = codeBaseURI.StartsWith("file:") ? codeBaseURI.Remove(0, "file:".Length) : codeBaseURI; codeBasePath = codeBasePath.TrimStart('/'); Environment.CurrentDirectory = Path.GetDirectoryName(codeBasePath); // Add some Console logs manually for NUnit if (!Log.Core.Outputs.OfType<TextWriterLogOutput>().Any(o => o.Target == Console.Out)) { if (this.consoleLogOutput == null) this.consoleLogOutput = new TextWriterLogOutput(Console.Out); Log.AddGlobalOutput(this.consoleLogOutput); } // Initialize Duality DualityApp.Init( DualityApp.ExecutionEnvironment.Launcher, DualityApp.ExecutionContext.Game, new DefaultPluginLoader(), null); // Manually register pseudo-plugin for the Unit Testing Assembly this.unitTestPlugin = DualityApp.LoadPlugin(typeof(DualityTestsPlugin).Assembly, codeBasePath); // Create a dummy window, to get access to all the device contexts if (this.dummyWindow == null) { WindowOptions options = new WindowOptions { Width = 800, Height = 600 }; this.dummyWindow = DualityApp.OpenWindow(options); } // Load local testing memory TestHelper.LocalTestMemory = Serializer.TryReadObject<TestMemory>(TestHelper.LocalTestMemoryFilePath, typeof(XmlSerializer)); Console.WriteLine("----- Duality environment setup complete -----"); }
internal static void ReloadPlugin(string pluginFileName) { if (!pluginFileName.EndsWith(".core.dll", StringComparison.InvariantCultureIgnoreCase)) { Log.Core.Write("Skipping non-core plugin '{0}'...", pluginFileName); return; } Log.Core.Write("Reloading core plugin '{0}'...", pluginFileName); Log.Core.PushIndent(); // Load new plugin Assembly pluginAssembly = Assembly.Load(File.ReadAllBytes(pluginFileName)); Type pluginType = pluginAssembly.GetExportedTypes().FirstOrDefault(t => typeof(CorePlugin).IsAssignableFrom(t)); CorePlugin plugin = (CorePlugin)pluginType.CreateInstanceOf(); // If we're overwriting an old plugin here, add the old version to the "disposed" blacklist CorePlugin oldPlugin; if (plugins.TryGetValue(plugin.AssemblyName, out oldPlugin)) { disposedPlugins.Add(oldPlugin.PluginAssembly); oldPlugin.Dispose(); } // Register newly loaded plugin plugins[plugin.AssemblyName] = plugin; // Discard temporary plugin-related data (cached Types, etc.) OnDiscardPluginData(new[] { oldPlugin }); Log.Core.PopIndent(); // Init plugin if (initialized) { plugin.InitPlugin(); OnPluginReady(plugin); } }
public CorePluginEventArgs(CorePlugin plugin) { this.plugin = plugin; }
internal static void InitPlugin(CorePlugin plugin) { pluginManager.InitPlugin(plugin); }
private static void OnPluginReady(CorePlugin plugin) { if (PluginReady != null) PluginReady(null, new CorePluginEventArgs(plugin)); }
internal static void InitPlugin(CorePlugin plugin) { try { plugin.InitPlugin(); OnPluginReady(plugin); } catch (Exception e) { Log.Core.WriteError("Error initializing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName); RemovePlugin(plugin); } }
private static void RemovePlugin(CorePlugin plugin) { // Dispose plugin and discard plugin related data disposedPlugins.Add(plugin.PluginAssembly); OnDiscardPluginData(); plugins.Remove(plugin.AssemblyName); try { plugin.Dispose(); } catch (Exception e) { Log.Core.WriteError("Error disposing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName); } // Discard temporary plugin-related data (cached Types, etc.) CleanupAfterPlugins(new[] { plugin }); }
/// <summary> /// Determines whether the specified plugin is referenced by any other plugin. /// </summary> /// <param name="plugin"></param> /// <returns></returns> public static bool IsDependencyPlugin(CorePlugin plugin) { foreach (CorePlugin loadedPlugin in plugins.Values) { AssemblyName[] refNames = loadedPlugin.PluginAssembly.GetReferencedAssemblies(); if (refNames.Any(rn => rn.Name == plugin.AssemblyName)) return true; } return false; }
private static void UnloadPlugin(CorePlugin plugin) { disposedPlugins.Add(plugin.PluginAssembly); OnDiscardPluginData(); plugins.Remove(plugin.AssemblyName); try { plugin.Dispose(); } catch (Exception e) { Log.Core.WriteError("Error disposing plugin {1}: {0}", Log.Exception(e), plugin.AssemblyName); } CleanupAfterPlugins(new[] { plugin }); }
private static void UnloadPlugin(CorePlugin plugin) { OnDiscardPluginData(new[] { plugin }); plugins.Remove(plugin.AssemblyName); disposedPlugins.Add(plugin.PluginAssembly); plugin.Dispose(); }