/// <summary> /// 从共享程序集LIB目录和根目录中配置项加载程序集 /// </summary> /// <returns></returns> private void LoadShareAssemblys() { log.Debug("框架加载共享程序集!"); if (Directory.Exists(shareLibsDirectoryPath)) { var files = Directory.GetFiles(shareLibsDirectoryPath, "*.*", SearchOption.AllDirectories) .Where(s => s.ToLower().EndsWith(".dll") || s.ToLower().EndsWith(".exe")).ToList(); foreach (var file in files) { LoadShareAssemblyByReflect(file); } } var shareLibs = BundleConfigProvider.GetConfigRootShareDll(); foreach (var shareLib in shareLibs) { var shareLibFile = Path.Combine(Environment.CurrentDirectory, shareLib); if (File.Exists(shareLibFile)) { LoadShareAssemblyByReflect(shareLibFile); } } DomainAssemblyInsertShareLib(); }
/// <summary> /// 搜索发现Bundles /// </summary> private void DiscoverBundles() { log.Debug("框架读取模块信息!"); BundleConfigProvider.LoadBundlesConfig(bundlesDirectoryPath); foreach (var bundleConfig in BundleConfigProvider.BundlesConfiguration) { //Bundle目录 var bundleKey = bundleConfig.Key; //Bundle配置节点 var bundleConfigData = bundleConfig.Value; string bundleDirectoryName = Path.Combine(bundlesDirectoryPath, bundleKey); try { IBundle bundle = new Bundle(this, bundleDirectoryName, bundleConfigData); if (bundleList.Exists(b => b.Equals(bundle))) { log.Warn(string.Format("插件[{0})]存在多重安装,只加载第一个!", bundleKey)); continue; } bundleList.Add(bundle); } catch (Exception ex) { log.Error("加载Bundle时出现异常!", ex); } } }
/// <summary> /// 程序集是否属于Framework class dll /// </summary> /// <param name="assemblyName">程序集名称</param> /// <returns>是否属于</returns> public static Boolean IsAssemblyBelongsFcl(string assemblyName) { return(assemblyName.StartsWith("System.") || assemblyName.Equals("System") || assemblyName.Equals("mscorlib") || assemblyName.Equals("OSGi.NET") || BundleConfigProvider.CheckDllInWhiteList(assemblyName)); }
/// <summary> /// 指定路径更新当前Bundle /// </summary> /// <param name="zipFile">更新的Bundle路径</param> public void Update(string zipFile) { log.Debug("模块更新开始!"); int preState = state; if (File.Exists(zipFile)) { string tmpBundleDirectoryPath = string.Format("{0}_{1}", this.GetBundleFolderName(), Guid.NewGuid().ToString()); BundleUtils.ExtractBundleFile(tmpBundleDirectoryPath, zipFile); var xmlNode = BundleConfigProvider.ReadBundleConfig(tmpBundleDirectoryPath); try { var tmpassemblyName = BundleConfigProvider.GetBundleConfigAssemblyName(xmlNode); var assemblyName = this.GetBundleAssemblyFileName(); if (!assemblyName.Equals(tmpassemblyName)) { throw new Exception(string.Format("要更新的插件[{0}]与输入流中的插件[{1}]不匹配!", assemblyName, tmpassemblyName)); } } catch (Exception ex) { Directory.Delete(tmpBundleDirectoryPath, true); throw ex; } //删除当前bundle ((IFrameworkInstaller)framework).Delete(this); //替换当前bundle Directory.Move(tmpBundleDirectoryPath, bundleDirectoryPath); //更新配置节点 this.manifestData = xmlNode; //更新Bundle配置信息 BundleConfigProvider.SyncBundleConfig(this.GetBundleFolderName(), xmlNode); } //目前插件持续状态存在三种 if (preState == BundleStateConst.INSTALLED) { this.Init(); } else if (preState == BundleStateConst.RESOLVED) { this.Init(); this.Resolve(); } else if (preState == BundleStateConst.ACTIVE) { this.Stop(); this.Init(); this.Resolve(); this.Start(); } log.Debug("模块更新完成!"); }
/// <summary> /// 读取配置信息 /// </summary> private void ReadConfig() { log.Debug("框架读取配置!"); bundlesDirectoryPath = BundleConfigProvider.GetBundlesDirectory(); shareLibsDirectoryPath = BundleConfigProvider.GetShareLibsDirectory(); bundlesUninstallPath = BundleConfigProvider.GetBundlesUninstallDirectory(); }
/// <summary> /// 卸载组件 /// </summary> public void UnInstall() { log.Debug("模块卸载开始!"); ((IFrameworkInstaller)framework).UnInstall(this); this.RemoveAllRefAssembly(); //移除Bundle配置信息 BundleConfigProvider.RemoveBundleConfig(this.GetBundleFolderName()); log.Debug("模块卸载完成!"); }
/// <summary> /// 安装指定Bundle模块 /// </summary> /// <param name="zipFile">Bundle文件全路径</param> /// <returns>已安装的Bundle对象实例</returns> public IBundle Install(string zipFile) { var folderName = Path.GetFileNameWithoutExtension(zipFile); var newBundlePath = Path.Combine(bundlesDirectoryPath, folderName ?? string.Empty); log.Debug(string.Format("模块[{0}]安装开始!", folderName)); //如果存在同名改名 if (Directory.Exists(newBundlePath)) { folderName = string.Format("{0}_{1}", folderName, Guid.NewGuid().ToString()); newBundlePath = Path.Combine(bundlesDirectoryPath, folderName); } BundleUtils.ExtractBundleFile(newBundlePath, zipFile); //读取bundle配置信息 var xmlNode = BundleConfigProvider.ReadBundleConfig(newBundlePath); try { var assemblyNameNode = xmlNode.Attributes == null ? null : xmlNode.Attributes["AssemblyName"]; var tmpassemblyName = assemblyNameNode == null ? string.Empty : assemblyNameNode.Value; foreach (IBundle installedBundle in bundleList) { //如果此插件的相同版本已经安装 var assemblyName = installedBundle.GetBundleAssemblyFileName(); if (assemblyName.Equals(tmpassemblyName)) { throw new Exception(string.Format("名称为[{0}]的插件已经存在,安装失败!", installedBundle.GetSymbolicName())); } } //添加Bundle配置信息 BundleConfigProvider.SyncBundleConfig(folderName, xmlNode); IBundle bundle = new Bundle(this, newBundlePath, xmlNode); bundleList.Add(bundle); log.Debug(string.Format("模块[{0}]安装完成!", folderName)); return(bundle); } catch (Exception ex) { log.Error("指定模块安装失败!", ex); Directory.Delete(newBundlePath, true); throw; } }
/// <summary> /// 初始化扩展信息 /// </summary> private void LoadExtensions() { log.Debug("扩展点加载开始!"); try { this.extensionPoints.Clear(); this.extensionDatas.Clear(); var extensionPointNames = BundleConfigProvider.GetBundleConfigExtensionPoints(this.manifestData); this.extensionPoints = extensionPointNames.Select(name => new ExtensionPoint() { Name = name, Owner = this }).ToList(); var extensionDataDic = BundleConfigProvider.GetBundleConfigExtensionDatas(this.manifestData); this.extensionDatas = extensionDataDic.Select(item => new ExtensionData() { Name = item.Key, Owner = this, ExtensionList = item.Value }).ToList(); //扩展已安装的Bundle的扩展点信息 foreach (IBundle bundle in this.framework.GetBundles()) { var bundlePoints = bundle.GetExtensionPoints(); foreach (ExtensionPoint extensionPoint in bundlePoints) { var extensionData = extensionDatas.FirstOrDefault(item => item.Name == extensionPoint.Name); if (extensionData != null) { log.Debug(string.Format("扩展点{0}加载!", extensionPoint.Name)); var eventArgs = new ExtensionEventArgs(ExtensionEventArgs.LOAD, extensionPoint, extensionData); var fireContext = (IContextFireEvent)bundle.GetBundleContext(); fireContext.FireExtensionChanged(this, eventArgs); var frameworkFireEvent = (IFrameworkFireEvent)framework; frameworkFireEvent.FireExtensionEvent(eventArgs); } } } //从已经安装的Bundle中发现扩展数据 foreach (ExtensionPoint extensionPoint in extensionPoints) { foreach (IBundle bundle in this.framework.GetBundles()) { var bundleExtensionDatas = bundle.GetExtensionDatas(); var extensionData = bundleExtensionDatas.FirstOrDefault(item => item.Name == extensionPoint.Name); if (extensionData != null) { log.Debug(string.Format("扩展点{0}加载!", extensionPoint.Name)); var eventArgs = new ExtensionEventArgs(ExtensionEventArgs.LOAD, extensionPoint, extensionData); var fireContext = (IContextFireEvent)this.GetBundleContext(); fireContext.FireExtensionChanged(bundle, eventArgs); var frameworkFireEvent = (IFrameworkFireEvent)framework; frameworkFireEvent.FireExtensionEvent(eventArgs); } } } } catch (Exception ex) { log.Error("加载Bundle扩展点配置信息出错!", ex); throw ex; } log.Debug("扩展点加载结束!"); }
/// <summary> /// 读取元数据信息 /// </summary> private void LoadMetaData(string assemblyName) { log.Debug(string.Format("模块读取元数据信息![{0}]", assemblyName)); //另开一个AppDomain来加载主程序集,得到名称和版本信息 metaDataDictionary = new Dictionary <string, string>(); AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = System.Environment.CurrentDirectory; Evidence adevidence = AppDomain.CurrentDomain.Evidence; AppDomain tmpAppDomain = AppDomain.CreateDomain(string.Format("Bundle[{0}] AppDomain", assemblyName), adevidence, domaininfo); AssemblyResolver assemblyResolver = tmpAppDomain.CreateInstanceAndUnwrap(typeof(Bundle).Assembly.FullName, typeof(AssemblyResolver).FullName) as AssemblyResolver; assemblyResolver.Init((File.ReadAllBytes(bundleAssemblyFileName)), GetBundleLibsDirectoryName(), BundleConfigProvider.GetShareLibsDirectory()); this.bundleAssemblyFullName = assemblyResolver.GetAssemblyFullName(); this.bundleSymbolicName = assemblyResolver.GetAssemblyName(); metaDataDictionary.Add(BundleConst.BUNDLE_MANIFEST_SYMBOLIC_NAME, bundleSymbolicName); this.bundleVersion = assemblyResolver.GetVersion(); metaDataDictionary.Add(BundleConst.BUNDLE_MANIFEST_VERSION, bundleVersion.ToString()); metaDataDictionary.Add(BundleConst.BUNDLE_MANIFEST_NAME, assemblyResolver.GetAssemblyTitle()); metaDataDictionary.Add(BundleConst.BUNDLE_MANIFEST_VENDOR, assemblyResolver.GetVendor()); metaDataDictionary.Add(BundleConst.BUNDLE_MANIFEST_REQUIRE_BUNDLE, assemblyResolver.GetAssemblyRequiredAssembly()); assemblyResolver = null; AppDomain.Unload(tmpAppDomain); }
/// <summary> /// 获取当前Bundle启动级别 /// </summary> /// <returns>Bundle启动级别</returns> public int GetBundleStartLevel() { return(BundleConfigProvider.GetBundleConfigStartLevel(this.manifestData)); }
/// <summary> /// 获取当前Bundle程序集文件名称 /// </summary> /// <returns>Bundle程序集文件名称</returns> public string GetBundleAssemblyFileName() { return(BundleConfigProvider.GetBundleConfigAssemblyName(this.manifestData)); }