Esempio n. 1
0
        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);
            }
        }