Unity中通过Jint调用js库

在最近的一个项目中遇到了一个需求,一个现有的加密解密的库是Javascript写的,且已经用到了服务器代码中,所以我这边客户端这边有两个选择:

  • “翻译”过来,将JS库中的代码用**C#*写一遍,但其中很多方法差异很大,js代码作为弱类型语言在很多二进制操作上显得非常宽泛,使得移植代码比较麻烦;
  • 找到一个可以用C#直接调用JS库的方案;

通过一段时间调研,首先在AssetStore上找到一个库:Jurassic,可以使得通过C#调用JS方法,但是实例当中调用的代码都是非常简单的一个运算过程,而我需要调用的是一个js的库。

然后我找到了一个C#调用JS的方案:Jint和一篇文章:Jint: Invoke Javascript from .NET;

里面提到了一个调用js库的示例:

public static void Handlebars()
{
    var engine = new Jint.Engine();

    engine.Execute(File.ReadAllText("handlebars-v4.0.11.js"));

    engine.SetValue("context", new
    {
        cats = new[]
        {
            new {name = "Feivel"},
            new {name = "Lilly"}
        }
    });

    engine.SetValue("source", "  says meow!!!\n");

    engine.Execute("var template = Handlebars.compile(source);");

    var result = engine.Execute("template(context)").GetCompletionValue();

    Console.WriteLine(result);
}

简单来说就是通过File读取库文件(不需要更改后缀),用过SetValue设置参数名称和值,用过Execute传入一段字符串来调用代码,得到结果。

js库中的代码主要为encodedecode:

encode:function( mix,depth) {
    ````
    return rv;
}
````
decode :function(data, first){ 
    return str;
}

而c#中的调用代码为:

var engine = new Engine();

engine.Execute(File.ReadAllText("Assets/MsgPack.js"));

List<object> fu = new List<object>();

engine.SetValue("mix","fuckyou");

engine.SetValue("depth",0);

var end = engine.Execute("msgPack.encode(mix,depth);").GetCompletionValue();

print(end);

var dataArr = end.AsArray();

print("fuck " + dataArr);

engine.SetValue("data",dataArr);

engine.SetValue("first","fuckyou");

var out_str = engine.Execute("msgPack.decode(data,first);").GetCompletionValue();

print(out_str);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值