/// <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); }
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); } } }
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); } }