首页 > 代码库 > LuaInterface简介

LuaInterface简介

  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 = http://www.mamicode.com/0;        public void TestPrint(int num)        {            Console.WriteLine("TestClass.TestPrint Called! value = http://www.mamicode.com/{0}", value =http://www.mamicode.com/ 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()");        }    }}