private static LauncherErrorCode RunSingleInstance(bool shouldStartHidden) { try { // Setup the XenkoDir to make sure that it is passed to the underlying process (msbuild...etc.) Environment.SetEnvironmentVariable("SiliconStudioXenkoDir", AppDomain.CurrentDomain.BaseDirectory); Environment.SetEnvironmentVariable("XenkoDir", 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.EnsurePrivacyPolicyXenko30(); // Install Metrics for the launcher using (Metrics = new MetricsClient(CommonApps.XenkoLauncherAppId)) { // 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); } }
public static void Main() { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; EditorPath.EditorTitle = XenkoGameStudio.EditorName; if (IntPtr.Size == 4) { MessageBox.Show("Xenko GameStudio requires a 64bit OS to run.", "Xenko", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } PrivacyPolicyHelper.RestartApplication = RestartApplication; PrivacyPolicyHelper.EnsurePrivacyPolicyXenko30(); // Set the XenkoDir environment variable var installDir = DirectoryHelper.GetInstallationDirectory("Xenko"); Environment.SetEnvironmentVariable("XenkoDir", installDir); // 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, XenkoGameStudio.EditorVersionMajor, false); mru.LoadFromSettings(); EditorSettings.Initialize(); Thread.CurrentThread.Name = "Main thread"; // Install Metrics for the editor using (XenkoGameStudio.MetricsClient = new MetricsClient(CommonApps.XenkoEditorAppId)) { try { // Environment.GetCommandLineArgs correctly process arguments regarding the presence of '\' and '"' var args = Environment.GetCommandLineArgs().Skip(1).ToList(); var startupSessionPath = XenkoEditorSettings.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(); } 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.Activated += (sender, eventArgs) => { XenkoGameStudio.MetricsClient?.SetActiveState(true); }; app.Deactivated += (sender, eventArgs) => { XenkoGameStudio.MetricsClient?.SetActiveState(false); }; app.InitializeComponent(); app.Run(); } renderDocManager?.Shutdown(); } catch (Exception e) { HandleException(e, 0); } } }
public static void Main() { // wait, are we already running? int waitToClose = 16; while (Process.GetProcessesByName("Focus.GameStudio").Length > 1) { if (waitToClose-- <= 0) { MessageBox.Show("Focus GameStudio is already running! Only one instance is possible at a time.", "Focus", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } Thread.Sleep(250); } AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; EditorPath.EditorTitle = XenkoGameStudio.EditorName; if (IntPtr.Size == 4) { MessageBox.Show(EngineName + " " + GameStudioName + " requires a 64bit OS to run.", "Focus", MessageBoxButton.OK, MessageBoxImage.Error); Environment.Exit(1); } PrivacyPolicyHelper.RestartApplication = RestartApplication; PrivacyPolicyHelper.EnsurePrivacyPolicyXenko30(); // 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 = "EditorGameThread (GameStudio)"; EntityManager.EnforceThreads = false; try { // Environment.GetCommandLineArgs correctly process arguments regarding the presence of '\' and '"' var args = Environment.GetCommandLineArgs().Skip(1).ToList(); var startupSessionPath = XenkoEditorSettings.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(); } 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?.Shutdown(); } catch (Exception e) { HandleException(e, 0); } }