Пример #1
0
        public string ExecuteCommand(string commandLine)
        {
            var           bundles = framework.GetBundleContext().GetBundles();
            StringBuilder sb      = new StringBuilder();

            sb.Append("Index".PadLeft(5));
            sb.Append("|");
            sb.Append("State".PadRight(12));
            sb.Append("|");
            sb.Append("Name");
            sb.AppendLine();
            var index = 0;

            foreach (IBundle bundle in bundles)
            {
                sb.Append(index.ToString().PadLeft(5));
                sb.Append("|");
                sb.Append(BundleUtils.GetBundleStateString(bundle.GetState()).PadRight(12));
                sb.Append("|");
                sb.Append(String.Format("{0} ({1}) \"{2}\"", bundle.GetSymbolicName(), bundle.GetVersion(), bundle.GetManifest()["Name"]));
                sb.AppendLine();
                index++;
            }
            return(sb.ToString());
        }
Пример #2
0
        //加载所需的所有程序集
        private void loadAssemblys()
        {
            AssemblyDefinition     bundleAssemblyDefinition     = AssemblyDefinition.ReadAssembly(bundleAssemblyFileName);
            AssemblyNameDefinition bundleAssemblyNameDefinition = bundleAssemblyDefinition.Name;

            //修改名称
            bundleAssemblyNameDefinition.Name = getAssemblyNameWithGuid(bundleAssemblyNameDefinition.Name);
            //去掉强签名
            removeAssemblyStrongName(bundleAssemblyNameDefinition);

            foreach (ModuleDefinition moduleDefinition in bundleAssemblyDefinition.Modules)
            {
                foreach (AssemblyNameReference assemblyNameReference in moduleDefinition.AssemblyReferences)
                {
                    String     assemblyName = assemblyNameReference.Name;
                    BundleImpl bundle       = getBundleFromRequiredBundles(assemblyName);
                    if (bundle == null)
                    {
                        //没找到此名称的插件,首先,如果此程序集属于FCL
                        if (BundleUtils.IsAssemblyBelongsFCL(assemblyName))
                        {
                            continue;
                        }
                        //然后尝试从bootdelegation字典中搜索
                        else if (allBundleRefAssemblyDict.ContainsKey(assemblyName))
                        {
                            assemblyNameReference.Name = getAssemblyNameWithGuid(assemblyNameReference.Name);
                            addRefAssembly(assemblyNameReference.Name, allBundleRefAssemblyDict[assemblyName]);
                        }
                        else
                        {
                            //然后则尝试从lib目录加载
                            String newAssemblyName = loadAssemblyFromLibDir(assemblyName);
                            if (newAssemblyName == null)
                            {
                                throw new IOException(String.Format("{0}不能解析依赖的程序集[{1}]", this.ToString(), assemblyName));
                            }
                            assemblyNameReference.Name = newAssemblyName;
                        }
                    }
                    else
                    {
                        AssemblyName requiredBundleAssemblyName = bundle.bundleAssembly.GetName();
                        assemblyNameReference.Name    = requiredBundleAssemblyName.Name;
                        assemblyNameReference.Version = requiredBundleAssemblyName.Version;
                    }
                    //去掉强签名
                    removeAssemblyStrongName(assemblyNameReference);
                }
                moduleDefinition.Attributes &= ~ModuleAttributes.StrongNameSigned;
            }
            MemoryStream ms = new MemoryStream();

            bundleAssemblyDefinition.Write(ms);
            bundleAssembly = Assembly.Load(ms.ToArray());
            //加载程序集中所有的类
            bundleAssembly.GetTypes();
            addRefAssembly(bundleAssemblyNameDefinition.Name, bundleAssembly);
        }
Пример #3
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("模块更新完成!");
        }
Пример #4
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;
            }
        }
Пример #5
0
        /// <summary>
        /// 从LIB目录加载程序集并返回新的程序集名称
        /// </summary>
        /// <param name="assemblyName">程序集名称</param>
        /// <returns>新的程序集名称</returns>
        private String loadAssemblyFromLibDir(String assemblyName)
        {
            //如果是.NET运行库自带的程序集
            if (BundleUtils.IsAssemblyBelongsFCL(assemblyName))
            {
                return(null);
            }

            String libsDirPath      = getBundleLibsDirectoryName();
            String assemblyFileName = Path.Combine(libsDirPath, assemblyName + ".dll");

            if (!File.Exists(assemblyFileName))
            {
                return(null);
            }

            AssemblyDefinition     assemblyDefinition     = AssemblyDefinition.ReadAssembly(assemblyFileName);
            AssemblyNameDefinition assemblyNameDefinition = assemblyDefinition.Name;

            //修改名称
            assemblyNameDefinition.Name = getAssemblyNameWithGuid(assemblyNameDefinition.Name);
            //去掉强签名
            removeAssemblyStrongName(assemblyNameDefinition);

            foreach (ModuleDefinition moduleDefinition in assemblyDefinition.Modules)
            {
                foreach (AssemblyNameReference refAssemblyNameReference in moduleDefinition.AssemblyReferences)
                {
                    String refAssemblyName    = refAssemblyNameReference.Name;
                    String newRefAssemblyName = loadAssemblyFromLibDir(refAssemblyName);
                    if (newRefAssemblyName == null)
                    {
                        continue;
                    }
                    refAssemblyNameReference.Name = newRefAssemblyName;
                    //去掉强签名
                    removeAssemblyStrongName(refAssemblyNameReference);
                }
                moduleDefinition.Attributes &= ~ModuleAttributes.StrongNameSigned;
            }
            MemoryStream ms = new MemoryStream();

            assemblyDefinition.Write(ms);
            Assembly assembly = Assembly.Load(ms.ToArray());

            addRefAssembly(assemblyNameDefinition.Name, assembly);
            return(assemblyNameDefinition.Name);
        }
Пример #6
0
        /// <summary>
        /// 将domain程序集插入共享程序集
        /// </summary>
        private void DomainAssemblyInsertShareLib()
        {
            var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();

            foreach (var assembly in assemblies)
            {
                if (!BundleUtils.IsAssemblyBelongsFcl(assembly.GetName().Name))
                {
                    if (!BundleAssemblyProvider.CheckHasShareLib(assembly.FullName))
                    {
                        log.Debug(string.Format("框架关联共享程序集[{0}]!", assembly.GetName().Name));

                        BundleAssemblyProvider.AddShareAssembly(assembly.FullName, assembly);
                    }
                }
            }
        }
Пример #7
0
 /// <summary>
 /// 返回GAC程序集
 /// </summary>
 /// <param name="assemblyFullName"></param>
 /// <returns></returns>
 internal static Assembly GetGacAssembly(string assemblyFullName)
 {
     try
     {
         var assemblyName = new AssemblyName(assemblyFullName);
         if (BundleUtils.IsAssemblyBelongsFcl(assemblyName.Name) &&
             !assemblyName.Name.Contains(".resources") &&
             !assemblyName.Name.Contains(".XmlSerializers"))
         {
             log.Debug(string.Format("加载.NET FrameWork框架程集:{0}", assemblyFullName));
             return(Assembly.Load(assemblyFullName));
         }
         return(null);
     }
     catch (Exception)
     {
         return(null);
     }
 }
Пример #8
0
        public string ExecuteCommand(string commandLine)
        {
            Bundle[]      bundles = framework.getBundleContext().getBundles();
            StringBuilder sb      = new StringBuilder();

            sb.Append("ID".PadLeft(5));
            sb.Append("|");
            sb.Append("State".PadRight(12));
            sb.Append("|");
            sb.Append("Name");
            sb.AppendLine();
            foreach (Bundle bundle in bundles)
            {
                sb.Append(bundle.getBundleId().ToString().PadLeft(5));
                sb.Append("|");
                sb.Append(BundleUtils.GetBundleStateString(bundle.getState()).PadRight(12));
                sb.Append("|");
                sb.Append(String.Format("{0} ({1}) \"{2}\"", bundle.getSymbolicName(), bundle.getVersion(), bundle.getHeaders()["Name"]));
                sb.AppendLine();
            }
            return(sb.ToString());
        }
Пример #9
0
        public string ExecuteCommand(string commandLine)
        {
            String  bundleIdStr = commandLine.Substring(GetCommandName().Length).Trim();
            var     bundleId    = int.Parse(bundleIdStr);
            IBundle bundle      = framework.GetBundleContext().GetBundle(bundleId);

            if (bundle == null)
            {
                return(String.Format("未找到Index为[{0}]的插件", bundleId));
            }
            bundle.Start();
            return(String.Format("启动插件[{0} ({1})]完成,当前状态为:{2}", bundle.GetSymbolicName(), bundle.GetVersion(), BundleUtils.GetBundleStateString(bundle.GetState())));
        }
Пример #10
0
        /// <summary>
        /// 从LIB目录加载程序集并返回新的程序集名称
        /// </summary>
        /// <param name="assemblyName">程序集名称</param>
        /// <returns>程序集定义</returns>
        private AssemblyDefinition LoadAssemblyFromLibDir(string assemblyName)
        {
            //如果是.NET运行库自带的程序集
            if (BundleUtils.IsAssemblyBelongsFcl(assemblyName))
            {
                return(null);
            }

            string libsDirPath = GetBundleLibsDirectoryName();

            if (!Directory.Exists(libsDirPath))
            {
                Directory.CreateDirectory(libsDirPath);
            }

            //string assemblyFileName = Path.Combine(libsDirPath, assemblyName + ".dll");
            string[] files = Directory.GetFiles(libsDirPath, assemblyName + ".dll", SearchOption.AllDirectories);

            if (files.Length == 0)
            {
                return(null);
            }

            var assemblyFileName = files[0];

            var readerParameter = new ReaderParameters()
            {
                AssemblyResolver = new CustomAssemblyResolver(
                    resolverAssemblyFullName =>
                {
                    var resolverAssemblyName = new AssemblyName(resolverAssemblyFullName);
                    var resolverDefinition   = this.GetBundleRefDefinition(resolverAssemblyFullName);
                    if (resolverDefinition == null)
                    {
                        return(LoadAssemblyFromLibDir(resolverAssemblyName.Name));
                    }
                    return(resolverDefinition);
                })
            };

            AssemblyDefinition     assemblyDefinition     = AssemblyDefinition.ReadAssembly(assemblyFileName, readerParameter);
            AssemblyNameDefinition assemblyNameDefinition = assemblyDefinition.Name;

            //去掉强签名
            BundleUtils.RemoveAssemblyStrongName(assemblyNameDefinition);

            //目前机制采用修订版本号方式控制程序集隔离
            MarkAssembleyVersion(assemblyNameDefinition);

            foreach (ModuleDefinition moduleDefinition in assemblyDefinition.Modules)
            {
                foreach (AssemblyNameReference refAssemblyNameReference in moduleDefinition.AssemblyReferences)
                {
                    string refAssemblyName = refAssemblyNameReference.Name;
                    //1.共享库优先
                    if (BundleAssemblyProvider.CheckHasShareLib(refAssemblyNameReference.FullName))
                    {
                        var shareAssembly = BundleAssemblyProvider.GetShareAssembly(refAssemblyNameReference.FullName);
                        refAssemblyNameReference.Name    = shareAssembly.GetName().Name;
                        refAssemblyNameReference.Version = shareAssembly.GetName().Version;
                        //目前共项目为反射,不移除强命名

                        log.Debug(string.Format("模块关联共享库程序集[{0}]!", assemblyName));

                        continue;
                    }

                    //2.尝试从当前Bundle已加载的程序集关联
                    var bundleRefAssembly = GetBundleRefAssembly(refAssemblyNameReference.FullName);
                    if (bundleRefAssembly != null)
                    {
                        refAssemblyNameReference.Name    = bundleRefAssembly.GetName().Name;
                        refAssemblyNameReference.Version = bundleRefAssembly.GetName().Version;
                        BundleUtils.RemoveAssemblyStrongName(refAssemblyNameReference);

                        log.Debug(string.Format("模块关联自身库程序集[{0}]!", assemblyName));

                        continue;
                    }

                    //3.Bundle Lib文件夹
                    var newRefAssemblyDefinition = LoadAssemblyFromLibDir(refAssemblyName);
                    if (newRefAssemblyDefinition != null)
                    {
                        refAssemblyNameReference.Name    = newRefAssemblyDefinition.Name.Name;
                        refAssemblyNameReference.Version = newRefAssemblyDefinition.Name.Version;
                        BundleUtils.RemoveAssemblyStrongName(refAssemblyNameReference);

                        log.Debug(string.Format("模块关联自身库程序集[{0}]!", assemblyName));

                        continue;
                    }

                    //目前对于依赖程序集的引用程序集如无发现,不做处理
                }
                moduleDefinition.Attributes &= ~ModuleAttributes.StrongNameSigned;
            }
            MemoryStream ms = new MemoryStream();

            assemblyDefinition.Write(ms);

            Assembly assembly;

            if (BundleConfigProvider.OSGi_NET_IS_DEBUG_MODE)
            {
                assembly = Assembly.LoadFrom(assemblyFileName);
            }
            else
            {
                assembly = Assembly.Load(ms.ToArray());
            }
            //将Lib程序集加载到程序集提供程序

            if (BundleConfigProvider.OSGi_NET_ALLTYPES_LOAD)
            {
                assembly.GetTypes();
            }

            log.Debug(string.Format("模块加载依赖程序集[{0}]!", assemblyName));

            AddRefAssembly(assemblyNameDefinition.FullName, assembly, assemblyDefinition);

            return(assemblyDefinition);
        }
Пример #11
0
        /// <summary>
        /// 2.加载所需的所有程序集
        /// </summary>
        private void LoadAssemblys()
        {
            log.Debug("模块加载自身程序集!");

            AssemblyDefinition     bundleAssemblyDefinition     = AssemblyDefinition.ReadAssembly(bundleAssemblyFileName);
            AssemblyNameDefinition bundleAssemblyNameDefinition = bundleAssemblyDefinition.Name;

            //去掉强签名
            BundleUtils.RemoveAssemblyStrongName(bundleAssemblyNameDefinition);

            foreach (ModuleDefinition moduleDefinition in bundleAssemblyDefinition.Modules)
            {
                foreach (AssemblyNameReference assemblyNameReference in moduleDefinition.AssemblyReferences)
                {
                    string assemblyName = assemblyNameReference.Name;

                    //是否属于FCL
                    if (BundleUtils.IsAssemblyBelongsFcl(assemblyName))
                    {
                        continue;
                    }

                    //依赖项是否是Bundle
                    Bundle bundle = GetBundleFromRequiredBundles(assemblyName);
                    if (bundle != null)
                    {
                        AssemblyName requiredBundleAssemblyName = bundle.bundleAssembly.GetName();

                        assemblyNameReference.Name    = requiredBundleAssemblyName.Name;
                        assemblyNameReference.Version = requiredBundleAssemblyName.Version;
                        BundleUtils.RemoveAssemblyStrongName(assemblyNameReference);

                        log.Debug(string.Format("模块关联引用模块[{0}]!", assemblyName));

                        continue;
                    }

                    //1.首先尝试从共享程序集加载
                    if (BundleAssemblyProvider.CheckHasShareLib(assemblyNameReference.FullName))
                    {
                        //关联共享程序集
                        var shareAssembly = BundleAssemblyProvider.GetShareAssembly(assemblyNameReference.FullName);

                        assemblyNameReference.Name    = shareAssembly.GetName().Name;
                        assemblyNameReference.Version = shareAssembly.GetName().Version;
                        //目前共项目为反射,不移除强命名

                        log.Debug(string.Format("模块关联共享库程序集[{0}]!", assemblyName));

                        continue;
                    }

                    //2.尝试从当前Bundle已加载的程序集关联
                    var bundleRefAssembly = GetBundleRefAssembly(assemblyNameReference.FullName);
                    if (bundleRefAssembly != null)
                    {
                        assemblyNameReference.Name    = bundleRefAssembly.GetName().Name;
                        assemblyNameReference.Version = bundleRefAssembly.GetName().Version;
                        BundleUtils.RemoveAssemblyStrongName(assemblyNameReference);

                        log.Debug(string.Format("模块关联自身库程序集[{0}]!", assemblyName));

                        continue;
                    }

                    //3.尝试从lib目录重新加载
                    var newAssemblyDefinition = LoadAssemblyFromLibDir(assemblyName);
                    if (newAssemblyDefinition != null)
                    {
                        assemblyNameReference.Name    = newAssemblyDefinition.Name.Name;
                        assemblyNameReference.Version = newAssemblyDefinition.Name.Version;
                        BundleUtils.RemoveAssemblyStrongName(assemblyNameReference);

                        log.Debug(string.Format("模块关联自身库程序集[{0}]!", assemblyName));

                        continue;
                    }

                    //如果按如上步骤仍未发现程序集,抛出异常
                    throw new IOException(string.Format("{0}不能解析依赖的程序集[{1}]", this.ToString(), assemblyName));
                }
                moduleDefinition.Attributes &= ~ModuleAttributes.StrongNameSigned;
            }
            MemoryStream ms = new MemoryStream();

            bundleAssemblyDefinition.Write(ms);

            //是否Debug模式,如果debug,需要反射方式才能保证程序能进入Bundle断点
            if (BundleConfigProvider.OSGi_NET_IS_DEBUG_MODE)
            {
                bundleAssembly = Assembly.LoadFrom(bundleAssemblyFileName);
            }
            else
            {
                bundleAssembly = Assembly.Load(ms.ToArray());
            }
            //加载程序集中所有的类
            bundleAssembly.GetTypes();
            //将bundle程序集加入程序集提供程序
            AddRefAssembly(bundleAssemblyNameDefinition.FullName, bundleAssembly, bundleAssemblyDefinition);
        }