Ejemplo n.º 1
0
        /// <summary>
        ///  加载指定目录下所有程序集中的所有派生自baseType的类型
        /// </summary>
        /// <param name="baseType"></param>
        /// <param name="directorySearched">搜索的目录</param>
        /// <param name="searchChildFolder">是否搜索子目录中的程序集</param>
        /// <param name="config">高级配置,可以传入null采用默认配置</param>
        /// <returns>所有从BaseType派生的类型列表</returns>
        public static IList <Type> LoadDerivedType(Type baseType, string directorySearched, bool searchChildFolder, TypeLoadConfig config)
        {
            if (config == null)
            {
                config = new TypeLoadConfig();
            }

            IList <Type> derivedTypeList = new List <Type>();

            if (searchChildFolder)
            {
                LoadDerivedTypeInAllFolder(baseType, derivedTypeList, directorySearched, config);
            }
            else
            {
                LoadDerivedTypeInOneFolder(baseType, derivedTypeList, directorySearched, config);
            }

            return(derivedTypeList);
        }
Ejemplo n.º 2
0
        private static void LoadDerivedTypeInOneFolder(Type baseType, IList <Type> derivedTypeList, string folderPath, TypeLoadConfig config)
        {
            string[] files = Directory.GetFiles(folderPath);
            foreach (string file in files)
            {
                if (config.TargetFilePostfix != null)
                {
                    if (!file.EndsWith(config.TargetFilePostfix))
                    {
                        continue;
                    }
                }

                Assembly asm = null;

                #region Asm 加载程序集到内存中
                try
                {
                    if (config.CopyToMemory)
                    {
                        byte[] addinStream = FileHelper.ReadFileReturnBytes(file);
                        asm = Assembly.Load(addinStream);
                    }
                    else
                    {
                        asm = Assembly.LoadFrom(file);
                    }


                    if (asm == null)
                    {
                        continue;
                    }
                    #endregion

                    Type[] types = asm.GetTypes();

                    foreach (Type t in types)
                    {
                        if (t.IsPublic && (t.IsSubclassOf(baseType) || baseType.IsAssignableFrom(t)))
                        {
                            bool canLoad = config.LoadAbstractType || (!t.IsAbstract);
                            if (canLoad)
                            {
                                derivedTypeList.Add(t);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    //LogHelper.Error(ex);
                }
            }
        }
Ejemplo n.º 3
0
 private static void LoadDerivedTypeInAllFolder(Type baseType, IList <Type> derivedTypeList, string folderPath, TypeLoadConfig config)
 {
     LoadDerivedTypeInOneFolder(baseType, derivedTypeList, folderPath, config);
     string[] folders = Directory.GetDirectories(folderPath);
     foreach (string nextFolder in folders)
     {
         LoadDerivedTypeInAllFolder(baseType, derivedTypeList, nextFolder, config);
     }
 }