Exemplo n.º 1
0
        /// <summary>
        /// 关闭当前应用程序。
        /// </summary>
        public static void Exit()
        {
            var context = System.Threading.Interlocked.Exchange(ref _context, null);

            //如果上下文对象为空,则表示尚未启动
            if (context == null)
            {
                return;
            }

            //重置启动标记
            _isStarted = 0;

            //创建取消事件参数
            CancelEventArgs args = new CancelEventArgs();

            //激发“Exiting”事件
            OnExiting(args);

            //激发应用上下文对象的“Exiting”事件
            context.RaiseExiting(args);

            //判断是否取消退出,如果是则退出
            if (args.Cancel)
            {
                return;
            }

            //关闭工作台
            if (context.Workbench != null)
            {
                context.Workbench.Close();
            }

            //卸载插件模块
            DisposePluginModules(context);

            //卸载全局模块
            DisposeGlobalModules(context);

            //将当前应用上下文对象从列表中删除
            _context = null;
        }
Exemplo n.º 2
0
        private static void DisposePluginModules(PluginApplicationContext context)
        {
            if (context == null)
            {
                return;
            }

            foreach (Plugin plugin in context.PluginContext.PluginTree.Plugins)
            {
                if (plugin.Status != PluginStatus.Loaded)
                {
                    continue;
                }

                foreach (FixedElement <IApplicationModule> module in plugin.Modules)
                {
                    if (module.HasValue)
                    {
                        module.Value.Dispose();
                    }
                }
            }
        }
Exemplo n.º 3
0
        internal PluginContext(PluginSetup settings, PluginApplicationContext applicationContext)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }

            if (applicationContext == null)
            {
                throw new ArgumentNullException("applicationContext");
            }

            _settings           = (PluginSetup)settings.Clone();
            _pluginTree         = new PluginTree(this);
            _applicationContext = applicationContext;

            _settings.PropertyChanged += delegate
            {
                if (_pluginTree != null && _pluginTree.Status != PluginTreeStatus.None)
                {
                    throw new InvalidOperationException();
                }
            };
        }
Exemplo n.º 4
0
        public static void Start(PluginApplicationContext context, params string[] args)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (_isStarted != 0)
            {
                return;
            }

            //激发“Starting”事件
            OnStarting(context);

            //激发应用上下文对象的“Starting”事件
            context.RaiseStarting(args);

            try
            {
                context.PluginContext.PluginTree.Loader.Loaded += delegate
                {
                    //插件树加载完成即保存当前应用上下文
                    _context = context;

                    //将应用上下文对象挂载到插件结构中
                    _context.PluginContext.PluginTree.Mount(_context.PluginContext.Settings.ApplicationContextPath, _context);

                    //将应用上下文对象注册到默认服务容器中
                    if (_context.ServiceFactory != null && _context.ServiceFactory.Default != null)
                    {
                        _context.ServiceFactory.Default.Register("ApplicationContext", _context);
                    }
                };

                //初始化全局模块
                InitializeGlobalModules(context);

                //加载插件树
                context.PluginContext.PluginTree.Load();

                //初始化插件模块
                InitializePluginModules(context, context.PluginContext.PluginTree.Plugins);

                //激发应用上下文对象的“Initializing”事件
                context.RaiseInitializing(args);

                //如果工作台对象不为空则运行工作台
                if (context.GetWorkbench(args) != null)
                {
                    //激发应用上下文对象的“Initialized”事件
                    context.RaiseInitialized(args);

                    //注意:因为工作台很可能会阻塞当前主线程,所以需要利用其Opened事件进行注册
                    context.Workbench.Opened += delegate
                    {
                        //激发应用启动完成事件
                        RaiseStarted(args);
                    };

                    context.Workbench.Closed += delegate
                    {
                        Exit();
                    };

                    //启动工作台
                    context.Workbench.Open(args);
                }

                //激发应用启动完成事件
                RaiseStarted(args);
            }
            catch (Exception ex)
            {
                //应用无法启动,写入日志
                Tiandao.Diagnostics.Logger.Fatal(ex);

                //重抛异常
                throw;
            }
        }