/// <summary> /// 构造函数 /// </summary> public ViewEngineOptions() { ReferencedAssemblies = new HashSet <Assembly>() { typeof(object).Assembly, typeof(ViewEngineModel).Assembly, typeof(System.Collections.IList).Assembly, typeof(IEnumerable <>).Assembly, Reflect.GetAssembly("Microsoft.CSharp"), Reflect.GetAssembly("System.Runtime"), Reflect.GetAssembly("System.Linq"), Reflect.GetAssembly("System.Linq.Expressions") }; }
/// <summary> /// 获取应用有效程序集 /// </summary> /// <returns>IEnumerable</returns> private static (IEnumerable <Assembly> Assemblies, IEnumerable <Assembly> ExternalAssemblies) GetAssemblies() { // 需排除的程序集后缀 var excludeAssemblyNames = new string[] { "Database.Migrations" }; // 读取应用配置 var supportPackageNamePrefixs = Settings.SupportPackageNamePrefixs ?? Array.Empty <string>(); var dependencyContext = DependencyContext.Default; // 读取项目程序集或 Furion 官方发布的包,或手动添加引用的dll,或配置特定的包前缀 var scanAssemblies = dependencyContext.RuntimeLibraries .Where(u => (u.Type == "project" && !excludeAssemblyNames.Any(j => u.Name.EndsWith(j))) || (u.Type == "package" && (u.Name.StartsWith(nameof(Furion)) || supportPackageNamePrefixs.Any(p => u.Name.StartsWith(p)))) || (Settings.EnabledReferenceAssemblyScan == true && u.Type == "reference")) // 判断是否启用引用程序集扫描 .Select(u => Reflect.GetAssembly(u.Name)); IEnumerable <Assembly> externalAssemblies = Array.Empty <Assembly>(); // 加载 `appsetting.json` 配置的外部程序集 if (Settings.ExternalAssemblies != null && Settings.ExternalAssemblies.Any()) { foreach (var externalAssembly in Settings.ExternalAssemblies) { // 加载外部程序集 var assemblyFileFullPath = Path.Combine(AppContext.BaseDirectory , externalAssembly.EndsWith(".dll") ? externalAssembly : $"{externalAssembly}.dll"); // 根据路径加载程序集 var loadedAssembly = Reflect.LoadAssembly(assemblyFileFullPath); if (loadedAssembly == default) { continue; } var assembly = new[] { loadedAssembly }; // 合并程序集 scanAssemblies = scanAssemblies.Concat(assembly); externalAssemblies = externalAssemblies.Concat(assembly); } } return(scanAssemblies, externalAssemblies); }
/// <summary> /// 添加程序集引用 /// </summary> /// <param name="assemblyName"></param> public void AddAssemblyReferenceByName(string assemblyName) { var assembly = Reflect.GetAssembly(assemblyName); AddAssemblyReference(assembly); }