最近研究了下Lua和C#的交互,遇到C#里面的变参函数不能在lua调用的问题,后来用arg这个table变量解决了,贴个代码备忘下吧。。。C#需要引用LuaInterface。。。
using System;
using LuaInterface;
namespace LuaDemo
{
class MyLuaEngine
{
public void MyCSPrint(LuaTable luaTbl)
{
// pairs
//foreach (object oKey in luaTbl.Keys)
//{
// if (oKey.ToString() == "n") // “参数个数”索引
// continue;
// Console.Write("{0}\t", luaTbl[oKey]);
//}
// ipairs
for (int i = 1; i <= int.Parse(luaTbl["n"].ToString()); i++)
{
Console.Write("{0}\t", luaTbl[i]);
}
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
Lua luaVM = new Lua();
MyLuaEngine myLuaEngine = new MyLuaEngine();
Console.WriteLine("LuaDemo Starting...");
Console.WriteLine("By TZWSOHO 2012");
luaVM.RegisterFunction("MyCSPrint", myLuaEngine, myLuaEngine.GetType().GetMethod("MyCSPrint"));
// Lua 调用 C# 函数
luaVM.DoFile("luaDemo_1.lua");
luaVM.DoString("Print(nil, \"测试啊啊testing~~~\");");
// C# 调用 Lua 函数
luaVM.DoFile("luaDemo_2.lua");
LuaFunction luaFunc = luaVM.GetFunction("MyLuaPrint");
if (luaFunc != null)
{
object[] objRet = luaFunc.Call("abc", 123);
Console.WriteLine("函数返回 {0} 个参数!", objRet.Length);
}
else
{
Console.WriteLine("获取 lua 函数失败!");
}
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
}
luaDemo_1.lua,放在C#生成的EXE目录下,一般比如Debug目录下:
-- 使 _G.print 函数重定向到 C# 里面的自定义函数
local print = MyCSPrint
-- 因为这个函数后面要给 luaDemo_2.lua 使用
-- 所以这里不能用 local 修饰符
function Print(...)
-- 将所有参数化为一个 table 传给 C# 的函数
-- arg["n"] 为参数个数
print(arg)
end
local t = { "123a", "cba223" }
Print(t)
Print("测试test~~~@$#!%@#$%&^(^&*)")
Print("测试test~~~@$#!%@#$%&^(^&*)", t)
luaDemo_2.lua,也放在EXE目录下:
-- 这里不能用 local 修饰符
function MyLuaPrint(...)
local t = { "haha", 123, szContent }
--require("luaDemo_1")
--dofile("luaDemo_1.lua")
loadfile("luaDemo_1.lua")
Print(...) -- 调用 luaDemo_1.lua 里面的打印函数
return 2012, t, "abc"
end