码迷,mamicode.com
首页 > 其他好文 > 详细

LuaInterface简介

时间:2014-08-10 01:39:39      阅读:554      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   strong   文件   for   

  Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库。LuaInterface则用于实现Lua和CLR的混合编程。

(一)Lua from the CLR

  测试环境:在VS2010中建一个C#控制台应用程序,并添加LuaInterface.dll的引用(安装LuaForWindows或直接下载LuaInterface都可得到该文件)。

  LuaInterface.Lua类是CLR访问Lua解释器的主要接口,一个LuaInterface.Lua类对象就代表了一个Lua解释器(或Lua执行环境),Lua解释器可以同时存在多个,并且它们之间是完全相互独立的。

  下面的简单代码展示了以下功能:

  (1)CLR访问Lua的全局域: 下标/索引操作[]

  (2)CLR新建Lua的table:NewTable

  (3)CLR中执行Lua脚本代码或脚本文件:DoFile、DoString

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LuaInterface;

namespace TestCSharpAndLuaInterface
{
        static void Main(string[] args)
        {
            // 新建一个Lua解释器,每一个Lua实例都相互独立
            Lua lua = new Lua();

            // Lua的索引操作[]可以创建、访问、修改global域,括号里面是变量名
            // 创建global域num和str
            lua["num"] = 2;
            lua["str"] = "a string";
            
            // 创建空table
            lua.NewTable("tab");

            // 执行lua脚本,着两个方法都会返回object[]记录脚本的执行结果
            lua.DoString("num = 100; print(\"i am a lua string\")");
            lua.DoFile("C:\\luatest\\testLuaInterface.lua");
            object[] retVals = lua.DoString("return num,str");

            // 访问global域num和str
            double num = (double)lua["num"];
            string str = (string)lua["str"];

            Console.WriteLine("num = {0}", num);
            Console.WriteLine("str = {0}", str);
            Console.WriteLine("width = {0}", lua["width"]);
            Console.WriteLine("height = {0}", lua["height"]);
        }
    }
}

LuaIntrface自动对应Lua和CLR中的一些基础类型
  [nil, null]
  [string, System.String]
  [number, System.Double]
  [boolean, System.Boolean]
  [table, LuaInterface.LuaTable]
  [function, LuaInterface.LuaFunction]
以上对应关系反之亦然。

特殊类型:userdata

  (1)CLR中不能自动匹配Lua类型的对象(以上基础类型之外的类型)传给Lua时,转换为userdata,当Lua把这些userdata传回给CLR时,这些userdata又转换回原类型对象;
  (2)Lua里面生成的userdata从Lua传到CLR时转换为LuaInterface.LuaUserData。

  LuaTable和LuaUserData都有索引操作[],用来访问或修改域值,索引可以为string或number。
  LuaFunction和LuaUserData都有call方法用来执行函数,可以传入任意多个参数并返回多个值。

Lua调用CLR的函数:RegisterFunction方法用来将CLR函数注册进Lua解释器,供Lua代码调用,看下面这个例子:

namespace TestCSharpAndLuaInterface
{
    class TestClass
    {
        private int value = 0;

        public void TestPrint(int num)
        {
            Console.WriteLine("TestClass.TestPrint Called! value = {0}", value = num);
        }

        public static void TestStaticPrint()
        {
            Console.WriteLine("TestClass.TestStaticPrint Called!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            
            TestClass obj = new TestClass();
            // 注册CLR对象方法到Lua,供Lua调用
            lua.RegisterFunction("LuaTestPrint", obj, obj.GetType().GetMethod("TestPrint"));    // 也可用 typeof(TestClass).GetMethod("TestPrint")
            // 注册CLR静态方法到Lua,供Lua调用
            lua.RegisterFunction("LuaStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint"));

            lua.DoString("LuaTestPrint(10)");
            lua.DoString("LuaStaticPrint()");
        }
    }
}

 

LuaInterface简介,布布扣,bubuko.com

LuaInterface简介

标签:style   blog   color   os   io   strong   文件   for   

原文地址:http://www.cnblogs.com/sifenkesi/p/3901831.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!