Natasha 域(二)

发布时间 2023-04-14 16:14:11作者: 摧残一生

Natasha的构成

Natasha官网给出的例子中(例子),用了两种方式去完成了同一件事情

这两种方式也是Natasha脚本构建器的重要组成部分,Complier编译器和Template模板。

  • Complier编译器 白话就是自己写一个cs代码,然后由Natasha动态编译
    • AssemblyCSharpBuilder
    • OopBuilder 构建对象模板
    • MethodBuilder 构建方法模板
  • Template模板 自己写那么多代码不方便,就按照Natasha提供的方法进行编码,这样只需要关注核心业务模块即可

  • 类似于不同的dll或者命名空间,各部分代码都相互独立

  • 通过设置域(UseDomain方法)后,域内的类或方法即可调用

  • 创建域

    //获取默认域,默认的域名为Default
    // 等于NatashaReferenceDomain.DefaultDomain
    NatashaManagement.GetDefaultDomain();
    //获取随机域,NatashaReferenceDomain的name即为域名
    NatashaManagement.CreateRandomDomain();
    //获取指定名称的域
    NatashaManagement.CreateDomain(string domainName);
    
  • 域使用举例

    public void Domain() {
        //预热 Natasha
        NatashaManagement.Preheating();
        //创建默认的域
        NatashaReferenceDomain management = NatashaManagement.GetDefaultDomain();
        StringBuilder bodyCode = new StringBuilder();
        //动态编译的代码
        // 第一个参数为string,第二个为int
        // 运行后输入一个数值,系统根据带入的参数判断,选择第int个值并输出
        bodyCode.Append("" +
            "string message = Console.ReadLine();" +
            "if (message != null){" +
            "       string result = \"\";" +
            "       if (message.Length <= arg2){" +
            "           result = \"not find the message,the length less than \" + arg2;" +
            "       }else{" +
            "           result = $\" you find message is {message.Substring(arg2, 1)}\";" +
            "       }" +
            "       return $\"this params is {arg1}, {result}\";" +
            "}else{" +
            "      return \"message is null\";" +
            "}");
        var action = NDelegate
            // 使用默认的域
            .UseDomain(management)
            // class名称为Demo2
            .ConfigClass(item => item.Name("Demo2")
            // 这里如果不加载,必须自己引用所有相关的dll和类型,否则无法使用
            // 如果公共的类中不包含,则必须单独引用
            // .NoGlobalUsing()
            //不加载当前域编译产生的Using
            // 如果该域中其他类单独添加了引用,可以通过该方法不添加此引用
            .NotLoadDomainUsing()) 
            .Func<string, int, string>(bodyCode.ToString());
        Console.WriteLine(action("测试", 2));
    
    
        //复用上面的类和方法
        var func = NDelegate
            // 默认的域
            .UseDomain(management)
            // 调用
            .Func<string>("return Demo2.Invoke(\"张三\",3);");
        Console.WriteLine(func()); 
    }
    

    输出结果