Example #1
0
        /// <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();
        }
Example #2
0
        /// <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);
                }
            }
        }
Example #3
0
 /// <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));
 }
Example #4
0
        /// <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("模块更新完成!");
        }
Example #5
0
        /// <summary>
        /// 读取配置信息
        /// </summary>
        private void ReadConfig()
        {
            log.Debug("框架读取配置!");


            bundlesDirectoryPath = BundleConfigProvider.GetBundlesDirectory();

            shareLibsDirectoryPath = BundleConfigProvider.GetShareLibsDirectory();

            bundlesUninstallPath = BundleConfigProvider.GetBundlesUninstallDirectory();
        }
Example #6
0
        /// <summary>
        /// 卸载组件
        /// </summary>
        public void UnInstall()
        {
            log.Debug("模块卸载开始!");

            ((IFrameworkInstaller)framework).UnInstall(this);
            this.RemoveAllRefAssembly();
            //移除Bundle配置信息
            BundleConfigProvider.RemoveBundleConfig(this.GetBundleFolderName());

            log.Debug("模块卸载完成!");
        }
Example #7
0
        /// <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;
            }
        }
Example #8
0
        /// <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("扩展点加载结束!");
        }
Example #9
0
        /// <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);
        }
Example #10
0
 /// <summary>
 /// 获取当前Bundle启动级别
 /// </summary>
 /// <returns>Bundle启动级别</returns>
 public int GetBundleStartLevel()
 {
     return(BundleConfigProvider.GetBundleConfigStartLevel(this.manifestData));
 }
Example #11
0
 /// <summary>
 /// 获取当前Bundle程序集文件名称
 /// </summary>
 /// <returns>Bundle程序集文件名称</returns>
 public string GetBundleAssemblyFileName()
 {
     return(BundleConfigProvider.GetBundleConfigAssemblyName(this.manifestData));
 }