private void RunApplication(string appToOpen, string[] args) { byte[] application; string pathToOpen = _myLib.CurrentDirectory + appToOpen + ".mye"; if (!_currentDrive.Exists(FileSystemPath.Parse(pathToOpen))) { if (_currentDrive.Exists(FileSystemPath.Parse("/system/" + appToOpen + ".mye"))) { pathToOpen = "/system/" + appToOpen + ".mye"; } else { Console.WriteLine("Application not found"); return; } } using (Stream applicationStream = _currentDrive.OpenFile(FileSystemPath.Parse(pathToOpen), FileAccess.Read)) { application = applicationStream.ReadAllBytes(); } try { Assembly assembly = Assembly.Load(application); IEnumerable <Type> osType = from t in assembly.GetTypes() where t.Name == "Application" select t; if (osType.Count() > 1) { throw new Exception("Too many applications"); } IProcess applicationItem = (IProcess)Activator.CreateInstance(osType.First()); switch (applicationItem.ProcessType) { case ProcessType.KernelApplication: KernelProcess kernelProcess = (KernelProcess)applicationItem; kernelProcess.Initialize(_kernel, _processManager, _myLib); _processManager.Register(kernelProcess); kernelProcess.Run(args); break; case ProcessType.UserApplication: UserProcess userProcess = (UserProcess)applicationItem; userProcess.Initialize(_processManager, _myLib); _processManager.Register(userProcess); userProcess.Run(args); break; case ProcessType.KernelService: KernelService kernelService = (KernelService)applicationItem; kernelService.Initialize(_kernel, _processManager, _myLib); _processManager.Register(kernelService); kernelService.Run(args); break; default: Console.WriteLine("Don't know how to start {0}", applicationItem.ProcessType); break; } } catch (ReflectionTypeLoadException error) { Console.WriteLine("Can't load {0}:", appToOpen); error.LoaderExceptions.ToList().ForEach(x => Console.WriteLine(" {0}", x.Message)); } catch (Exception e) { Console.WriteLine("FATAL ERROR: {0}\n{1}", e.Message, e.StackTrace); } }