Beispiel #1
0
        /// <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");
        }