在最近的一个项目中遇到了一个需求,一个现有的加密解密的库是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库中的代码主要为encode和decode:
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);