首页 > 其他分享 >Natasha V5.2.2.1 稳定版正式发布.

Natasha V5.2.2.1 稳定版正式发布.

时间:2023-04-26 14:23:17浏览次数:41  
标签:稳定版 Console builder 程序 编译 WriteLine V5.2 2.1 public

DotNetCore.Natasha.CSharp v5.2.2.1

  • 使用 NMS Template 接管 CI 的部分功能.
  • 取消 SourceLink.GitHub 的继承性.
  • 优化几处内存占用问题.
  • 增加隐式 using 配置文件以支持隐式 using 引用. 当项目开启 <ImplicitUsings>enable</ImplicitUsings> 时,自动生效.
  • 增加初始化 PE 信息判断, 跳过无效 DLL 文件.
  • 整改 AssemblyCSharpBuilder, 修改几处 API:
    • 增加 GetAvailableCompilation, 开发者使用此API可以进行单独编译信息整合以及语义语法修剪,其结果为 Compilation 属性, 为下一步编译程序集做准备.
    • 增加 ClearCompilationCache 移除当前 编译单元的编译信息, 运行 GetAvailableCompilation/GetAssembly 将重新构建编译信息.
    • 增加 WithRandomAssenblyName 将当前编译单元的程序集名更改为 GUID 随机名.
    • 增加 ClearScript 清除当前编译单元储存的所有C#脚本代码.
    • 增加 Clear 清除脚本代码,清除编译信息,清除程序集名.
  • 增加一个节省性能开销的 API.
    • AnalysisIgnoreAccessibility(), 调用此方法,语义检测将检测元数据的访问级别,可能增加性能开销.
    • NotAnalysisIgnoreAccessibility(), 调用此方法,语义检测将忽视检测元数据的访问级别,降低开销(编译单元默认使用的是低开销方案), 安全编程请选择此项.
  • 编译单元增加两个方便操作的 API.
    • AddWithFullUsing(script): 增加脚本时,默认覆盖全域的 Using 引用.
    • AddWithDefaultUsing(script): 增加脚本时,默认覆盖主域的 Using 引用.
  • 新增 Type 的扩展 API:
    • GetDelegateFromType , 参考 GetDelegateFromShortName 的用法.
  • [破坏性更改] 下列 API, 从 AssemblyCSharpBuilder 的扩展方法 更改为 Assembly 类型的扩展方法:
    • GetTypeFromShortName / GetTypeFromFullName,
    • GetMethodFromShortName / GetMethodFromFullName
    • GetDelegateFromShortName / GetDelegateFromFullName

使用迁移: builder.GetDelegateFromShortName() 更改为 builder.GetAssembly().GetDelegateFromShortName();
builder.GetAssembly() 仍然不可多次编译, 请及时缓存结果.

DotNetCore.Natasha.Domain v5.2.0.1

  • 取消 SourceLink.GitHub 的继承性.
  • 增加 全局 using 配置文件以支持全局 using 引用.

变更一览

    internal class Program
    {
        static void Main(string[] args)
        {
            //准备工作
            NatashaManagement.Preheating();
            AssemblyCSharpBuilder builder = new();
            builder.Domain = DomainManagement.Random();

            //填充一个
            builder.AddWithDefaultUsing("public class A { }");
            //此 API 可以在不用编译的情况下获取到已经格式化好的语法树.
            //注: GetAssembly 方法中已包括此方法, 但不会重复运行.
            builder.GetAvailableCompilation();
            var assemblyA = builder.GetAssembly();
            ShowAssemblyInfo(assemblyA);
            ShowSyntaxTree(builder.Compilation!);


            //清除编译信息,使 builder 可以重新组合 编译信息.
            builder.ClearCompilationCache();
            //重置程序集名,以免编译时产生冲突.
            builder.WithRandomAssenblyName();
            //向 builder 中追加类型 B.
            builder.AddWithDefaultUsing("public static class B{ public static void Show(){ Console.WriteLine(\"HelloWorld!\"); } }");
            
            var assemblyAB = builder.GetAssembly();
            ShowAssemblyInfo(assemblyAB);
            ShowSyntaxTree(builder.Compilation!);


            //反射方法并生成委托
            var action = assemblyAB.GetDelegateFromShortName<Action>("B", "Show");
            Console.WriteLine("运行方法:");
            action();

            //action.DisposeDomain();
            //Console.WriteLine(DomainManagement.IsDeleted(builder.Domain!.Name!));
            Console.ReadKey();

            static void ShowAssemblyInfo(Assembly assembly)
            {

                Console.WriteLine("此程序集名字:"+assembly.FullName);
                Console.WriteLine("此程序集是否为动态程序集:" + (assembly.IsDynamic ? "是" : "否"));
                Console.WriteLine("编译后的程序集中类的数量:" + assembly.GetTypes().Length);
                Console.WriteLine("程序集中的类分别是:" + string.Join(",", assembly.GetTypes().Select(item => item.Name)));
               
            }

            static void ShowSyntaxTree(Compilation compilation)
            {
                Console.WriteLine("---------------------------");
                foreach (var item in compilation.SyntaxTrees)
                {
                    Console.WriteLine("脚本代码:");
                    Console.WriteLine(item.ToString());
                }
                Console.WriteLine("---------------------------");
            }
        }
    }

结果如下:


此程序集名字:9a7962dc0b004c2481d615c5e044c6df, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
此程序集是否为动态程序集:否
编译后的程序集中类的数量:3
程序集中的类分别是:EmbeddedAttribute,RefSafetyRulesAttribute,A
-----------脚本代码-----------
public class A
{
}
-----------------------------

此程序集名字:a17ce8ef9c164e558facf13425b279c6, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
此程序集是否为动态程序集:否
编译后的程序集中类的数量:4
程序集中的类分别是:EmbeddedAttribute,RefSafetyRulesAttribute,A,B
-----------脚本代码-----------
public class A
{
}
using System;

public static class B
{
    public static void Show()
    {
        Console.WriteLine("HelloWorld!");
    }
}
-----------------------------

运行方法:
HelloWorld!

标签:稳定版,Console,builder,程序,编译,WriteLine,V5.2,2.1,public
From: https://www.cnblogs.com/NMSLanX/p/17349425.html

相关文章

  • k8s-问题:[root@master log]# kubectl get node The connection to the server 192.168
    记一次测试虚拟机异常关机导致的问题[root@masterlog]#kubectlgetnodeTheconnectiontotheserver192.168.0.105:6443wasrefused-didyouspecifytherighthostorport?这个问题网上的大部分解决方案是kubeadminit直接这么搞我相信肯定能恢复,毕竟是重新初始化,但......
  • 5.2.1 循环控制:如何用break和continue来控制循环
          ......
  • 银河麒麟高级服务器操作系统V10 SP3安装kafka_2.12-2.3.1
    银河麒麟高级服务器操作系统V10SP3安装kafka_2.12-2.3.1 1.安装环境设置1关闭Selinux12345678910111213141516171819[root@localhost~]#vim/etc/selinux/config #Thisfilecontrolsthestate of SELinux on thesystem.#SELI......
  • 2.1 个人所得税问题
    自然语言描述问题:输入收入金额后,与起征点比较,若小于起征点,则个人所得税为0,若大于起征点则计算超出部分所应缴纳的税务流程图: 具体代码:#include<iostream>#include<stdio.h>usingnamespacestd;typedeflonglongll;intn;intmain1(){cin>>n;doubleans;if(n<3500)c......
  • Solon v2.2.12 发布,Java 应用开发框架
    Solon是一个高效的Java应用开发框架:更快、更小、更简单。它不是Spring、没有使用Servlet、JavaEE接口,是一个有自己接口标准的开放生态:150多个生态插件,可以满足各种场景开发大量的国产框架适配,可以为应用软件国产化提供更好支持,助力信创建设相对于SpringBoot和Sprin......
  • 操作系统(3.2.1)--作业调度的主要任务
    作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。有时也把作业调度称为接纳调度(AdmissionScheduling)。......
  • 自编译玩客云docker版OpenWrt R22.1.1(2022年2月13日更新)
    openwrt本地直接导入玩客云的步骤做了介绍,本篇适合于没有条件编译的朋友。2月13日更新内容:添加插件ttyd、netdata。拉取地址:dockerpulljyhking/onecloud:1.22月11日更新内容:增加s905系列docker版openwrt拉取地址:dockerpulljyhking/onecloud:s905_11月29日优化更新内容:1、简化......
  • 半期复习——第二章:进程管理(2.1 2.2)
    2.1前趋图和程序执行一、前趋图图(a)所示的前趋图,关系:P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9或表示为二元关系<P,→>P={P1,P2,P3,P4,P5,P6,P7,P8,P9}→={(P1,P2),(P1,P3),(P1,P4),(P2,P5),(P3,P5),(P4,P6),(P4,P7),(P5,Ps),(P6,P8),(......
  • miui12稳定版内测答题答案大全
    很多的米粉都已经看到了自己手机即将迎来miui12,心里已经迫不及待的想要先体验内测版,但是不知道该怎么得到内测资格试题的答案,下面就给带来miui12稳定版内测答题答案大全。miui12稳定版内测答题答案大全:1、快如闪电出自miui哪个版本。正确答案:miui10。2、开发版内测的更新频率......
  • 二叉树遍历(102.144.94.145)
    102.二叉树的层序遍历BPS/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr)......