コード例 #1
0
        /// <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));
        }
コード例 #2
0
        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());
        }
コード例 #3
0
 /// <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);
 }
コード例 #4
0
 /// <summary>
 /// 清除当前Bundle引用程序集
 /// </summary>
 private void RemoveAllRefAssembly()
 {
     foreach (string assemblyName in bundleRefAssemblyDict.Keys)
     {
         BundleAssemblyProvider.RemoveAssembly(assemblyName);
     }
     bundleRefAssemblyDict.Clear();
     bundleRefDefinitionDict.Clear();
 }
コード例 #5
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);
                    }
                }
            }
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        /// <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);
            }
        }
コード例 #8
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);
        }
コード例 #9
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);
        }