一.C#调用lua
LuaInterface包含LuaInterface.dll和Luanet.dll两个核心类库,可以完成lua和c#(CLR)之间的相互调用。注意版本问题,我使用的时候一直报错找不到dll,下载使用了新版的luaInterface后解决。
使用LuaInterface完成c#对lua的调用,使用luanet完成lua对c#的调用。2.0.3版本的LuaInterface中并没有luanet,所以需要下载其他版本的luanet。
1.简单使用
在VS中新建一个C#控制台程序,引入LuaInterface和lua51两个类库。我使用的是2.0.3版本,下载地址:http://files.luaforge.net/releases/luainterface/luainterface
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua["num"] = 34; Console.WriteLine(lua["num"]); } } }
在这段程序中,使用类似于数组的方式为变量赋值。
2.DoString方法(执行一句lua语句)
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoString("num=2"); lua.DoString("str='a string'"); object[] values = lua.DoString("return num,str"); foreach(object o in values) { Console.WriteLine(o); } Console.ReadKey(); } } }
3.DoFile方法(读取并执行一个lua文件中的lua代码)
lua文件名称MyLua.lua
num = 2 str = 'movin' print(num,str)
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("MyLua.lua"); Console.ReadKey(); } } }
4.使用类似数组的方式取得lua中的变量
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("MyLua.lua"); double num = (double)lua["num"]; Console.WriteLine(num); Console.ReadKey(); } } }
5.把C#的方法注册为lua的全局方法
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); Program p = new Program(); //注册一个方法,首先需要new一个对象,然后通过反射获得对象中的方法并注册 //这一句代码将CLRMethod这个方法注册到lua中并保存为名称是LuaMethod的方法 lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod")); //通过DoString方法调用方法 lua.DoString("LuaMethod()"); Console.ReadKey(); } public void CLRMethod() { Console.WriteLine("movin 最帅"); } } }
6.将C#的静态方法注册进lua
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.RegisterFunction("LuaCLRMethod", null, typeof(Program).GetMethod("CLRMethod")); lua.DoString("LuaCLRMethod()"); Console.ReadKey(); } public static void CLRMethod() { Console.WriteLine("movin 最帅"); } } }
二.lua调用c#
将luanet.dll拷贝到项目的输出目录bin/debug下,注意拷贝后就不要再在lua文件中使用require引入luanet了,这样反而会出错。
1.简单使用
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("MyLua.lua"); Console.ReadKey(); } public static void CLRMethod() { Console.WriteLine("movin 最帅"); } } }
--加载System这个dll luanet.load_assembly("System") Int32 = luanet.import_type("System.Int32") print(Int32)
2.lua获取c#变量
--加载System这个dll luanet.load_assembly("System") --导入类 I32 = luanet.import_type("System.Int32") --创建对象 num = I32.Parse("23") print(num)
3.lua访问c#属性和方法
访问c#属性和方法时,将这些属性方法当作table的键值进行访问。使用luanet.load_assembly加载命名空间,使用luanet.import_type方法访问类。