Exemple #1
0
 /// <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")
     };
 }
Exemple #2
0
        /// <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);
        }