首页 > 代码库 > 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()"); } }}