示例#1
0
        //private string _tempBinPath;

        #region methods

        public bool Init(string[] args)
        {
            // Detection and correction of local settings of SE install location.
            var filePath = ToolboxUpdater.GetApplicationFilePath();

            var validApps = new string[] {
                "SpaceEngineers.exe",
                "SpaceEngineersDedicated.exe",
                //"MedievalEngineers.exe",
                //"MedievalEngineersDedicated.exe"
            };

            if (GlobalSettings.Default.PromptUser || !ToolboxUpdater.ValidateSpaceEngineersInstall(filePath))
            {
                if (Directory.Exists(filePath))
                {
                    foreach (var validApp in validApps)
                    {
                        var testPath = Path.Combine(filePath, validApp);
                        if (File.Exists(testPath))
                        {
                            filePath = testPath;
                            break;
                        }
                    }
                }

                var faModel = new FindApplicationModel()
                {
                    GameApplicationPath = filePath
                };
                var faViewModel = new FindApplicationViewModel(faModel);
                var faWindow    = new WindowFindApplication(faViewModel);

                if (faWindow.ShowDialog() == true)
                {
                    filePath = faModel.GameBinPath;
                }
                else
                {
                    return(false);
                }
            }

            // Update and save user path.
            GlobalSettings.Default.SEBinPath = filePath;
            GlobalSettings.Default.Save();

            var ignoreUpdates = args.Any(a => a.ToUpper() == "/X" || a.ToUpper() == "-X");
            var oldDlls       = true; // args.Any(a => a.ToUpper() == "/OLDDLL" || a.ToUpper() == "-OLDDLL");
            var altDlls       = !oldDlls;

            // Go looking for any changes in the Dependant Space Engineers assemblies and immediately attempt to update.
            if (!ignoreUpdates && !altDlls && ToolboxUpdater.IsBaseAssembliesChanged() && !Debugger.IsAttached)
            {
                ToolboxUpdater.RunElevated(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SEToolboxUpdate"), "/B " + String.Join(" ", args), false, false);
                return(false);
            }

            var proc = Process.GetCurrentProcess();

            if (Process.GetProcessesByName(proc.ProcessName).Length == 1)
            {
                // Clean up Temp files if this is the only instance running.
                TempfileUtil.DestroyTempFiles();
            }

            // Dot not load any of the Space Engineers assemblies or dependant classes before this point.
            // ============================================

            // Alternate experimental method for loading the Space Engineers API assemblies.
            // Copy them to temporary path, then load with reflection on demand through the AppDomain.
            //if (altDlls)
            //{
            //    _tempBinPath = ToolboxUpdater.GetBinCachePath();
            //    var searchPath = GlobalSettings.Default.SEBinPath;

            //    DirectoryInfo checkDir = null;
            //    var counter = 0;

            //    while (checkDir == null && counter < 10)
            //    {
            //        if (Directory.Exists(_tempBinPath))
            //            break;

            //        checkDir = Directory.CreateDirectory(_tempBinPath);

            //        if (checkDir == null)
            //        {
            //            // wait a while, as the drive may be processing Windows Explorer which had a lock on the Directory after prior cleanup.
            //            System.Threading.Thread.Sleep(100);
            //        }

            //        counter++;
            //    }

            //    foreach (var file in ToolboxUpdater.CoreSpaceEngineersFiles)
            //    {
            //        var filename = Path.Combine(searchPath, file);
            //        var destFilename = Path.Combine(_tempBinPath, file);

            //        if (ToolboxUpdater.DoFilesDiffer(searchPath, _tempBinPath, file))
            //        {
            //            try
            //            {
            //                File.Copy(filename, destFilename, true);
            //            }
            //            catch { }
            //        }
            //    }

            //    // Copy directories which contain Space Engineers language resources.
            //    var dirs = Directory.GetDirectories(searchPath);

            //    foreach (var sourceDir in dirs)
            //    {
            //        var dirName = Path.GetFileName(sourceDir);
            //        var destDir = Path.Combine(_tempBinPath, dirName);
            //        Directory.CreateDirectory(destDir);

            //        foreach (string oldFile in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories))
            //        {
            //            try
            //            {
            //                File.Copy(oldFile, Path.Combine(destDir, Path.GetFileName(oldFile)), true);
            //            }
            //            catch { }
            //        }
            //    }

            //    AppDomain currentDomain = AppDomain.CurrentDomain;
            //    currentDomain.AssemblyResolve += currentDomain_AssemblyResolve;
            //}

#if DEBUG
            // This will make it hairy for testing the AppDomain stuff.
            #warning Force the local debugger to load the Types allowing inspection.
            var settings0 = new VRage.Game.MyObjectBuilder_SessionSettings();
            var settings1 = new Sandbox.Common.ObjectBuilders.MyObjectBuilder_InteriorLight();
#endif

            return(true);
        }