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()); }
//加载所需的所有程序集 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); }
/// <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> /// 安装指定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> /// 从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); }
/// <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); } } } }
/// <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); } }
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()); }
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()))); }
/// <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); }
/// <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); }