/// <summary> /// 初始化 /// </summary> public void Init() { log.Debug("框架初始化开始!"); Assembly selfAssembly = typeof(Framework).Assembly; //将自身Bundle程序集提供程序 BundleAssemblyProvider.AddAssembly(selfAssembly.GetName().Name, selfAssembly); //读取配置文件 this.ReadConfig(); //将自身加入Bundle集合 this.bundleList.Add(this); //加载共享程序集目录dll this.LoadShareAssemblys(); //发现目录中的Bundle集合 this.DiscoverBundles(); log.Debug("框架初始化结束!"); this.state = BundleStateConst.RESOLVED; this.FireBundleEvent(new BundleEventArgs(BundleEventArgs.RESOLVED, this)); }
public string ExecuteCommand(string commandLine) { StringBuilder sb = new StringBuilder(); sb.AppendLine("当前Domain已加载的程序集"); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { Assembly assembly = assemblies[i]; AssemblyName assemblyName = assembly.GetName(); sb.Append(String.Format("[{0}]: {1}, Version:{2}", i, assemblyName.Name, assemblyName.Version)); sb.AppendLine(); } sb.AppendLine(); sb.AppendLine("当前Framework管理的程序集"); var assemblyList = BundleAssemblyProvider.GetManagedAssemblies(); var index = 0; foreach (var assembly in assemblyList) { AssemblyName assemblyName = assembly.GetName(); sb.Append(String.Format("[{0}]: {1}, Version:{2}", index++, assemblyName.Name, assemblyName.Version)); sb.AppendLine(); } return(sb.ToString()); }
/// <summary> /// 添加引用程序集 /// </summary> /// <param name="assemblyFullName"></param> /// <param name="assemblyDefinition"></param> /// <param name="assembly"></param> private void AddRefAssembly(string assemblyFullName, Assembly assembly, AssemblyDefinition assemblyDefinition) { if (!bundleRefAssemblyDict.ContainsKey(assemblyFullName)) { bundleRefAssemblyDict.Add(assemblyFullName, assembly); bundleRefDefinitionDict.Add(assemblyFullName, assemblyDefinition); } BundleAssemblyProvider.AddAssembly(assemblyFullName, assembly); }
/// <summary> /// 清除当前Bundle引用程序集 /// </summary> private void RemoveAllRefAssembly() { foreach (string assemblyName in bundleRefAssemblyDict.Keys) { BundleAssemblyProvider.RemoveAssembly(assemblyName); } bundleRefAssemblyDict.Clear(); bundleRefDefinitionDict.Clear(); }
/// <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> /// 重名程序集生成唯一版本号 /// </summary> /// <param name="assemblyNameReference">程序集Name引用</param> /// <returns>新版本</returns> private Version MarkAssembleyVersion(AssemblyNameReference assemblyNameReference) { //如果其他Bundle管理程序集已经存在 if (BundleAssemblyProvider.CheckHasBundleLib(assemblyNameReference.FullName)) { var version = assemblyNameReference.Version; var fixVersion = new Random().Next(0, 100); var newVersion = new Version(version.Major, version.Minor, version.Build, fixVersion); assemblyNameReference.Version = newVersion; if (BundleAssemblyProvider.CheckHasBundleLib(assemblyNameReference.FullName)) { this.MarkAssembleyVersion(assemblyNameReference); } } return(assemblyNameReference.Version); }
/// <summary> /// 通过反射加载程序集 /// </summary> /// <param name="assemblyFileName"></param> /// <returns></returns> private void LoadShareAssemblyByReflect(string assemblyFileName) { try { AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(assemblyFileName); if (!BundleAssemblyProvider.CheckHasShareLib(assemblyDefinition.FullName)) { Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().ToList() .FirstOrDefault(item => item.FullName == assemblyDefinition.FullName); if (assembly == null) { if (BundleConfigProvider.OSGi_NET_IS_DEBUG_MODE) { assembly = Assembly.LoadFrom(assemblyFileName); } else { assembly = Assembly.Load(File.ReadAllBytes(assemblyFileName)); } } if (BundleConfigProvider.OSGi_NET_ALLTYPES_LOAD) { assembly.GetTypes(); } log.Debug(string.Format("框架加载共享程序集[{0}]!", assembly.GetName().Name)); BundleAssemblyProvider.AddShareAssembly(assembly.FullName, assembly); } } catch (Exception ex) { log.Error(string.Format("加载共享程序集[{0}]时出现异常!", assemblyFileName), ex); } }
/// <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); }