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