示例#1
0
        private static LauncherErrorCode RunSingleInstance(bool shouldStartHidden)
        {
            try
            {
                // Only needed for Stride up to 2.x (and possibly 3.0): setup the StrideDir to make sure that it is passed to the underlying process (msbuild...etc.)
                Environment.SetEnvironmentVariable("SiliconStudioStrideDir", AppDomain.CurrentDomain.BaseDirectory);
                Environment.SetEnvironmentVariable("StrideDir", AppDomain.CurrentDomain.BaseDirectory);

                // We need to do that before starting recording metrics
                // TODO: we do not display Privacy Policy anymore from launcher, because it's either accepted from installer or shown again when a new version of GS with new Privacy Policy starts. Might want to reconsider that after the 2.0 free period
                PrivacyPolicyHelper.RestartApplication = SelfUpdater.RestartApplication;
                PrivacyPolicyHelper.EnsurePrivacyPolicyStride40();

                // Install Metrics for the launcher
                using (Metrics = new MetricsClient(CommonApps.StrideLauncherAppId))
                {
                    // HACK: force resolve the presentation assembly prior to initializing the app. This is to fix an issue with XAML themes.
                    // see issue PDX-2899
                    var txt = new Core.Presentation.Controls.TextBox();
                    GC.KeepAlive(txt); // prevent aggressive optimization from removing the line where we create the dummy TextBox.

                    var instance = new LauncherInstance();
                    return(instance.Run(shouldStartHidden));
                }
            }
            catch (Exception exception)
            {
                CrashReportHelper.HandleException(Dispatcher.CurrentDispatcher, exception);
                return(LauncherErrorCode.ErrorWhileRunningServer);
            }
        }
示例#2
0
        public static void Main()
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            EditorPath.EditorTitle = StrideGameStudio.EditorName;

            if (IntPtr.Size == 4)
            {
                MessageBox.Show("Stride GameStudio requires a 64bit OS to run.", "Stride", MessageBoxButton.OK, MessageBoxImage.Error);
                Environment.Exit(1);
            }

            PrivacyPolicyHelper.RestartApplication = RestartApplication;
            PrivacyPolicyHelper.EnsurePrivacyPolicyStride40();

            // We use MRU of the current version only when we're trying to reload last session.
            var mru = new MostRecentlyUsedFileCollection(InternalSettings.LoadProfileCopy, InternalSettings.MostRecentlyUsedSessions, InternalSettings.WriteFile);

            mru.LoadFromSettings();

            EditorSettings.Initialize();
            Thread.CurrentThread.Name = "Main thread";

            try
            {
                // Environment.GetCommandLineArgs correctly process arguments regarding the presence of '\' and '"'
                var args = Environment.GetCommandLineArgs().Skip(1).ToList();
                var startupSessionPath = StrideEditorSettings.StartupSession.GetValue();
                var lastSessionPath    = EditorSettings.ReloadLastSession.GetValue() ? mru.MostRecentlyUsedFiles.FirstOrDefault() : null;
                var initialSessionPath = !UPath.IsNullOrEmpty(startupSessionPath) ? startupSessionPath : lastSessionPath?.FilePath;

                // Handle arguments
                for (var i = 0; i < args.Count; i++)
                {
                    if (args[i] == "/LauncherWindowHandle")
                    {
                        windowHandle = new IntPtr(long.Parse(args[++i]));
                    }
                    else if (args[i] == "/NewProject")
                    {
                        initialSessionPath = null;
                    }
                    else if (args[i] == "/DebugEditorGraphics")
                    {
                        EmbeddedGame.DebugMode = true;
                    }
                    else if (args[i] == "/RenderDoc")
                    {
                        // TODO: RenderDoc is not working here (when not in debug)
                        GameStudioPreviewService.DisablePreview = true;
                        renderDocManager = new RenderDocManager();
                        renderDocManager.Initialize();
                    }
                    else if (args[i] == "/Reattach")
                    {
                        var debuggerProcessId = int.Parse(args[++i]);

                        if (!System.Diagnostics.Debugger.IsAttached)
                        {
                            using (var debugger = VisualStudioDebugger.GetByProcess(debuggerProcessId))
                            {
                                debugger?.Attach();
                            }
                        }
                    }
                    else if (args[i] == "/RecordEffects")
                    {
                        GameStudioBuilderService.GlobalEffectLogPath = args[++i];
                    }
                    else
                    {
                        initialSessionPath = args[i];
                    }
                }
                RuntimeHelpers.RunModuleConstructor(typeof(Asset).Module.ModuleHandle);

                //listen to logger for crash report
                GlobalLogger.GlobalMessageLogged += GlobalLoggerOnGlobalMessageLogged;

                mainDispatcher = Dispatcher.CurrentDispatcher;
                mainDispatcher.InvokeAsync(() => Startup(initialSessionPath));

                using (new WindowManager(mainDispatcher))
                {
                    app = new App {
                        ShutdownMode = ShutdownMode.OnExplicitShutdown
                    };

                    app.InitializeComponent();
                    app.Run();
                }

                renderDocManager?.RemoveHooks();
            }
            catch (Exception e)
            {
                HandleException(e, 0);
            }
        }