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

(未完待续)

posted on 2013-01-24 12:04  CosmoKey  阅读(4123)  评论(1编辑  收藏  举报

导航