C#调用脚本语言(二)-- IronJS基本语法
源代码下载地址:git://github.com/fholm/IronJS.git
GitHub地址:https://github.com/fholm/IronJS
IronJs.DLL 0.2.0.1下载:https://files.cnblogs.com/comsokey/IronJS0.2.0.1.zip
C# 调用JS方法
class Program { static void Main(string[] args) { var v = new IronJS.Hosting.CSharp.Context(); // 创建JS方法 v.Execute("function sayHello(str){ return {msg:'Hello ,' + str};}"); // 通过JS代码调用JS方法返回值 dynamic dy = v.Execute("sayHello('JS Call');"); Console.WriteLine(dy.msg); // 创建JS方法 v.Execute("function sayHello2(str){ return {msg:'Hello ,' + str.msg};}"); // 映射JS方法到指定的delegate上 dy = v.GetFunctionAs<GetWithMyClass>("sayHello2"); // 调用JS方法 dy = dy(new MyClass() {msg = "C# Call"}); // Console.WriteLine(dy.msg); Console.ReadKey(true); } private delegate dynamic GetWithMyClass(MyClass myClass); } class MyClass { public string msg; }
JS调用C#方法
var v = new IronJS.Hosting.CSharp.Context(); // 创建C#方法代码 Action<string> action = new Action<string>((str) => Console.WriteLine("C#方法接收到的参数:{0}", str)); // 创建FunctionObject FunctionObject fun = IronJS.Native.Utils.createHostFunction(v.Environment, action); // 绑定方法 v.SetGlobal("WriteLine", fun); //调用 v.Execute("WriteLine('12313');");
传递C#实例
var v = new IronJS.Hosting.CSharp.Context(); MyClass myClass = new MyClass(){msg = "C#实例"}; // 将实例映射到JS变量 v.SetGlobal("myClass",myClass); // 创建JS方法 v.Execute("function sayHello(){ return {msg:'Hello ,' + myClass.msg};}"); // 通过JS代码调用JS方法返回值 dynamic dy = v.Execute("sayHello();"); Console.WriteLine(dy.msg);
获取JS变量/解析Json
static void Main(string[] args) { var v = new IronJS.Hosting.CSharp.Context(); string strJson = " var json ={参数1:'json参数1',参数2:{参数21:1,参数22:2},参数3:[1,2,3]};" + " var json2 ={参数1:'json2参数1',参数2:{参数21:1,参数22:2},参数3:[1,2,3]};"; // 运行代码,获取最后一个变量。(本例中返回Json2) dynamic dy2 = v.Execute(strJson); // 获取指定JS变量值 dynamic dy1 = v.GetGlobalAs<dynamic>("json"); // 打印数据 Print(dy1); // 打印数据 Print(dy2); Console.ReadKey(true); } private static void Print(dynamic dy1) { Console.WriteLine("参数1:{0}",dy1.参数1); Console.WriteLine("参数21:{0}", dy1.参数2.参数21); Console.WriteLine("参数22:{0}", dy1.参数2.参数22); for (int i = 0; i < dy1.参数3.length; i++) { Console.WriteLine("参数3[{1}]:{0}", dy1.参数3[i],i); } }
注意:
调用JS方法时,传递参数为一个类实例,在JS方法中无法修改属性值。(不知道是不是测试的语句不正确)
但是可以通过将实例转化成Json对象进行传递,但该方法仅能解决简单类的实现。
PS:
简单类可以时间,但是在传入传出时需要序列化成Json
(未完待续)