Jurassic.ScriptEngine 使用

标记: Jurassic,js,net

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代码,互相调用。

源项目地址

posted @ 2015-09-15 23:53  过错  阅读(1652)  评论(0编辑  收藏  举报