zoukankan      html  css  js  c++  java
  • Jurassic.ScriptEngine 使用

    标记: ,,

    Jurassic.ScriptEngine是一个让net动态执行js的一个引擎。类似的有ironjs等。支持ECMAScript 5,非线程安全

    使用

    • using Jurassic;

    //1简单的执行js字符串

    js:

    function main(a,b)

    {

    return a+b;

    }

    c#

    var engine = new Jurassic.ScriptEngine(); engine.Evaluate("上面的js代码");// var addResult= engine.CallGlobalFunction(" main", 5, 6);//结果11

    //2加载 js库文件然后执行 js函数

    1
    2
    3
       var engine = new Jurassic.ScriptEngine();
        engine.ExecuteFile(@"underscore-min.js");
       tb.Text = engine.Evaluate("   _.first([5, 4, 3, 2, 1]);").ToString();
    

    // 先加载js文件 然后执行js库的函数

    //3 设置全局变量

    engine.SetGlobalValue("interop", 15);

    //4获取全局变量

    engine.GetGlobalValue<int>("interop")
     
    //5 从js中调用net的方法
    engine.SetGlobalFunction("test", new Func<int, int, int>((a, b) => a + b));//设置js全局函数test
    engine.Evaluate<int>("test(5, 6)")  //调用js函数test
    调用的时候注意js和net的类型对应关系

    C# type name            .NET type name                 JavaScript type name

    bool                           System.Boolean                  boolean

    int                               System.Int32                       number

    double                      System.Double                    number

    string                         System.String                      string

    Jurassic.Null               Jurassic.Null                        null

    Jurassic.Undefined   Jurassic.Undefined              undefined

    Jurassic.Library.ObjectInstance (or a derived type)   Jurassic.Library.ObjectInstance (or a derived type)         object

    //6  net调用js的方法

    engine.Evaluate("function test(a, b) { return a + b }");
    engine.CallGlobalFunction<int>("test", 5, 6);
     
    //7 暴露net的class给js
    using Jurassic;
    using Jurassic.Library;
    
    public class AppInfo : ObjectInstance
    {
        public AppInfo(ScriptEngine engine)
            : base(engine)
        {
            // 重写name属性
            this["name"] = "Test Application";
    
            // 只读属性
            this.DefineProperty("version", new PropertyDescriptor(5, PropertyAttributes.Sealed), true);
        }
    }
     
    engine.SetGlobalValue("appInfo", new AppInfo(engine));
    Console.WriteLine(engine.Evaluate<string>("appInfo.name + ' ' + appInfo.version"));

    // 8 暴露net的class的静态方法

    using Jurassic;
    using Jurassic.Library;
    
    public class Math2 : ObjectInstance
    {
        public Math2(ScriptEngine engine)
            : base(engine)
        {
            this.PopulateFunctions();
        }
    
        [JSFunction(Name = "log10")]
        public static double Log10(double num)
        {
            return Math.Log10(num);
        }
    }
     
    engine.SetGlobalValue("math2", new Math2(engine));
    engine.Evaluate<double>("math2.log10(1000)");

    // 9   暴露net的类实例

    using Jurassic;
    using Jurassic.Library;
    
    public class RandomConstructor : ClrFunction
    {
        public RandomConstructor(ScriptEngine engine)
            : base(engine.Function.InstancePrototype, "Random", new RandomInstance(engine.Object.InstancePrototype))
        {
        }
    
        [JSConstructorFunction]
        public RandomInstance Construct(int seed)
        {
            return new RandomInstance(this.InstancePrototype, seed);
        }
    }
    
    public class RandomInstance : ObjectInstance
    {
        private Random random;
    
        public RandomInstance(ObjectInstance prototype)
            : base(prototype)
        {
            this.PopulateFunctions();
            this.random = new Random(0);
        }
    
        public RandomInstance(ObjectInstance prototype, int seed)
            : base(prototype)
        {
            this.random = new Random(seed);
        }
    
        [JSFunction(Name = "nextDouble")]
        public double NextDouble()
        {
            return this.random.NextDouble();
        }
    }
     
     
    engine.SetGlobalValue("Random", new RandomConstructor(engine));
    engine.Evaluate<double>("var rand = new Random(1000); rand.nextDouble()");

    备注: 如果同cs-script配合使用,就可以同时动态执行js和net的cs代码,互相调用。

    源项目地址

  • 相关阅读:
    P3162 [CQOI2012]组装
    P3161 [CQOI2012]模拟工厂
    P3158 [CQOI2011]放棋子
    P3154 [CQOI2009]循环赛
    zabbix部署监控端(server)以及页面优化
    zabbix-agent端自定义监控项(free -m)服务器内存使用率
    java应用系统运行速度慢的解决方法
    at org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmplImpl.renderNoFlush(BackupMasterStatusTm
    解决Hbase启动后,hmaster会在几秒钟后自动关闭(停掉)!!!
    全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解)
  • 原文地址:https://www.cnblogs.com/wang2650/p/4811918.html
Copyright © 2011-2022 走看看