/// <summary> /// Reloads the specified plugin. Does not initialize it. /// </summary> /// <param name="pluginFilePath"></param> public T ReloadPlugin(string pluginFilePath) { // If we're trying to reload an active backend plugin, stop foreach (var pair in this.pluginRegistry) { T plugin = pair.Value; if (PathOp.ArePathsEqual(plugin.FilePath, pluginFilePath)) { foreach (Assembly lockedAssembly in this.lockedPlugins) { if (plugin.PluginAssembly == lockedAssembly) { this.pluginLog.WriteError( "Can't reload plugin {0}, because it has been locked by the runtime. " + "This usually happens for plugins that implement a currently active backend.", Log.Assembly(lockedAssembly)); return(null); } } break; } } // Load the updated plugin Assembly Assembly pluginAssembly = null; try { pluginAssembly = this.pluginLoader.LoadAssembly(pluginFilePath, true); } catch (Exception e) { this.pluginLog.WriteError("Error loading plugin Assembly: {0}", Log.Exception(e)); return(null); } // If we're overwriting an old plugin here, add the old version to the "disposed" blacklist string assemblyName = pluginAssembly.GetShortAssemblyName(); T oldPlugin; if (this.pluginRegistry.TryGetValue(assemblyName, out oldPlugin)) { this.pluginRegistry.Remove(assemblyName); this.disposedPlugins.Add(oldPlugin.PluginAssembly); this.OnPluginsRemoving(new[] { oldPlugin }); oldPlugin.Dispose(); } // Load the new plugin from the updated Assembly T updatedPlugin = this.LoadPlugin(pluginAssembly, pluginFilePath); // Discard temporary plugin-related data (cached Types, etc.) this.OnPluginsRemoved(new[] { oldPlugin }); return(updatedPlugin); }
/// <summary> /// Initializes this DualityApp. Should be called before performing any operations within Duality. /// </summary> /// <param name="context">The <see cref="ExecutionContext"/> in which Duality runs.</param> /// <param name="commandLineArgs"> /// Command line arguments to run this DualityApp with. /// Usually these are just the ones from the host application, passed on. /// </param> public static void Init(ExecutionEnvironment env, ExecutionContext context, IPluginLoader plugins, string[] commandLineArgs) { if (initialized) { return; } // Process command line options if (commandLineArgs != null) { // Enter debug mode if (commandLineArgs.Contains(CmdArgDebug)) { System.Diagnostics.Debugger.Launch(); } // Run from editor if (commandLineArgs.Contains(CmdArgEditor)) { runFromEditor = true; } } environment = env; execContext = context; // Initialize the plugin manager { pluginLoader = plugins ?? new Duality.Backend.Dummy.DummyPluginLoader(); Log.Core.Write("Using '{0}' to load plugins.", pluginLoader.GetType().Name); pluginLoader.Init(); // Log assembly loading data for diagnostic purposes { Log.Core.Write("Currently Loaded Assemblies:" + Environment.NewLine + "{0}", pluginLoader.LoadedAssemblies.ToString( assembly => " " + Log.Assembly(assembly), Environment.NewLine)); Log.Core.Write("Plugin Base Directories:" + Environment.NewLine + "{0}", pluginLoader.BaseDirectories.ToString( path => " " + path, Environment.NewLine)); Log.Core.Write("Available Assembly Paths:" + Environment.NewLine + "{0}", pluginLoader.AvailableAssemblyPaths.ToString( path => " " + path, Environment.NewLine)); } pluginManager.Init(pluginLoader); pluginManager.PluginsReady += pluginManager_PluginsReady; pluginManager.PluginsRemoving += pluginManager_PluginsRemoving; pluginManager.PluginsRemoved += pluginManager_PluginsRemoved; } // Load all plugins. This needs to be done first, so backends and Types can be located. pluginManager.LoadPlugins(); // Initialize the system backend for system info and file system access InitBackend(out systemBack); // Load application and user data and submit a change event, so all settings are applied LoadAppData(); LoadUserData(); OnAppDataChanged(); OnUserDataChanged(); // Initialize the graphics backend InitBackend(out graphicsBack); // Initialize the audio backend InitBackend(out audioBack); sound = new SoundDevice(); // Initialize all core plugins, this may allocate Resources or establish references between plugins pluginManager.InitPlugins(); initialized = true; // Write environment specs as a debug log Log.Core.Write( "DualityApp initialized" + Environment.NewLine + "Debug Mode: {0}" + Environment.NewLine + "Command line arguments: {1}", System.Diagnostics.Debugger.IsAttached, commandLineArgs != null ? commandLineArgs.ToString(", ") : "null"); }