每日快播:Natasha Preheating(三)

时间:2023-04-20 21:34:08 来源: 博客园
NatashaInitializer.Preheating 预热方法

首次使用Natasha时都需要进行初始化操作,其中该方法还可以加入一个回调函数作为参数,该回调函数主要作用为减少程序集引用文件的加载,可以有效的控制内存涨幅

  • 通过判断Preheating方法中回调函数的第二个参数,可以有选择性的加载哪一类

    // 可以通过声明哪一些包不需要引用,例如Drawing,Xml等// 该变量的数值应该为某一部分的包,如果写System,所有包含System的都无法引用,例如System;System.Linq等List noLoadDlls = new List() {     "Drawing","Xml"};// 第二个参数为系统添加的dll名称// 当返回值为true时为排除该引用// 当返回值为false时为添加该引用NatashaManagement.Preheating((asName, name) => {    if (!String.IsNullOrEmpty(name)) {        // 判断noLoadDlls中是否存在符合参数二的数据        // 如果有则返回noLoadDlls中的数据,否则返回空字符串        // 将判断的字符串都变为小写或大写,这样就不会出现大小写判断的问题了        var bReturn = noLoadDlls.Where(dll => name.ToLower().Contains(dll.ToLower())).ToList().FirstOrDefault("");        return !String.IsNullOrEmpty(bReturn);    }    return false;});
  • Preheating方法中回调函数的第一个参数为AssemblyName,主要判断程序集版本号,程序集名称等


    (资料图片仅供参考)

    AssemblyName中的Name就是回调函数中的第二个参数,单独拿出来的目的感觉主要还是对比名称

    // 排除 dapper 主版本号为 12 的程序集引用文件NatashaInitializer.Preheating((asmName, name) => {    if (asmName.Name != null)    {        if (asmName.Name.Contains("Dapper") && asmName.Version!.Major > 12)        {            return true;        }    }    return false;});
  • Preheating主要干了什么

    • 如果有回调函数,则赋值给DefaultUsing.SetDefaultUsingFilter和NatashaDomain.SetDefaultAssemblyFilter,让回调函数一直有效

    • 获取所有系统引用,回调函数,判断是否有手动排除引用的

      • 使用DependencyContext.Default.CompileLibraries获取CLR中的所有库

      • 其中AssemblyName.GetAssemblyName的作用为将文件转换为程序集

        // DependencyContext.Default.CompileLibraries获取CLR中的所有库IEnumerable? paths = DependencyContext         .Default      // cl.ResolveReferencePaths 获得的应为绝对路径         .CompileLibraries.SelectMany(cl => cl.ResolveReferencePaths().Where(asmPath =>         {             //将文件转换为程序集            var asmName = AssemblyName.GetAssemblyName(asmPath);             // Preheating的回调函数            return !excludeReferencesFunc(asmName, asmName.Name);         }));
    • 将排除后的都添加到Natasha中

      // 1. 通过Path.GetFileNameWithoutExtension获得文件名// 2. 把获得的文件名与文件的绝对地址关联起来var resolver = new PathAssemblyResolver(paths);// 检查目的而加载的 Type 对象的封闭范围// 参见:https://learn.microsoft.com/zh-cn/dotnet/api/system.reflection.metadataloadcontext?source=recommendations&view=dotnet-plat-ext-7.0using (var mlc = new MetadataLoadContext(resolver)){    // 并发var result = Parallel.ForEach(paths, (path) =>{        Assembly assembly = mlc.LoadFromAssemblyPath(path);        // 添加资源        NatashaReferenceDomain.DefaultDomain.References.AddReference(assembly.GetName(), path);        DefaultUsing.AddUsingWithoutCheck(assembly);        // 将该类放到缓存中        NatashaDomain.AddAssemblyToDefaultCache(assembly);    });    // 如果加载项一直没完成,则一直等待中    while (!result.IsCompleted)    {    Thread.Sleep(100);    }}
    • 创建了一个Supperess为CS8019的配置实例,然后测试了一下,没问题就结束了

    • 有问题,那Preheating初始化会失败

    • 结束

  • 移除了不需要的包,如果想额外的添加类或dll

    // 第一个方法必不可少NatashaInitializer.Preheating();// 1.增加全局的 Using 引用NatashaManagement.AddGlobalUsing("System.IO");// 2.向全局引用中增加类型对应的元数据// 如果需要Natasha 自动覆盖全部引用,请引入 "DotNetCore.Compile.Environment" 包.NatashaManagement.AddGlobalReference(typeof(int));// 3.直接追加程序集到全局引用中//  path为dll文件的绝对路径Assembly assembly = mlc.LoadFromAssemblyPath(path);NatashaReferenceDomain.DefaultDomain.References.AddReference(assembly);

标签:

精彩推送

每日快播:Natasha Preheating(三)

NatashaInitializer Preheating预热方法首次使用Natasha时都需要进行初始化操作,其中该方法还可以加入一个

来源:博客园2023.04.20

世界热推荐:中非共和国通报中国公民遇袭事件调查进展 中方回应

中新网北京4月20日电(记者张蔚然)中国外交部发言人汪文斌4月20日主持例行记者会。有记者提问:中非共和国有

来源:中国新闻网2023.04.20

柳药集团大幅下跌 一季度营收及利润双增长 公司拟定增募资10亿元

柳药集团盘中异动,截至10时12分股价下跌7 02%,换手率为1 54%,成交额1 37亿元。公司今日披露非公开发行预

来源:证券时报网2023.04.20

环球热门:Python面向对象编程-元类

在Python中,类也是对象,因此我们可以通过元类来动态地创建和修改类。元类是一种用于创建类的类,它可以在

来源:腾讯云2023.04.20

2023天津梨木台景区五一游(景区地址+门票价格)

》》》天津梨木台景区五一游门票价格梨木台景区门票价格为成人票门票+往返摆渡车:70元老年 学生 儿童票门

来源:本地宝2023.04.20

京东投诉电话人工服务电话号码_京东人工投诉电话号码

1、输入JD COM,点击我的。2、在我的界面,点击客服。3、进入客服界面,点击电话客服,直接找电话客服投诉

来源:互联网2023.04.20

国家发改委:出台务实管用政策措施 巩固经济向好势头

国家发改委:出台务实管用政策措施巩固经济向好势头

来源:环球网2023.04.20

4月20日收评:上证指数微跌0.09% 三市成交11386亿

今天(2023年04月20日)沪深京A股三市,上证指数小幅低开0 09%,报收3367 03点,跌幅3 10点,微跌0 09%;深

来源:大数据复盘2023.04.20

环球资讯:浙江《分布式光伏发电项目能源管理合同(范本)》发布

日前,浙江省光伏产业技术创新战略联盟在充分征求各方面意见基础上,联合杭州市太阳能光伏产业协会、杭州市

来源:浙江省发改委2023.04.20

新闻快讯

新闻快讯