/// <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; }
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(); } } } }
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(); } }; }
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; } }