[C#/Lua]C#和Lua交互的Demo

最近研究了下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


C#用的是控制台工程

详细描述Lua和C之间相互传递Table类型数据 /* ====================================================== */ // 遍历Lua传入的Table类型参数, 获取它的Key/Value, 其关键操作是 lua_next() // lua_next() 返回1表示读取成功,返回0表示已经没有数据可读了 // lua_next() 会使用栈顶元素作为Key去定位本次需要取出Table里面的那个值对 // 如果Key=nil, 那就表示本次取出的是第一个元素 // 它会先将当前的这个Key弹出,然后将本次取出的Key/Value压入栈, Value在栈顶 // 一个比较隐晦的处理就是, 我们不应直接使用lua_tostring(L, -2)来读取Key // 因为lua_tostring()在Key类型不是字符串时, 它会修改栈上的Key数据 // 这样, 下次调用lua_next()时, 就会因为Key被修改了而导致错误 // 为此,先调用lua_pushvalue(L, -2),将它Copy一份到栈顶,对这个Copy进行lua_tostring() // 读取Key,Value到C变量里面后,将Value和Copy弹出,留着Key在栈顶,给下次lua_next()用 // // 指令及栈图变化如下: (假如Table的栈下标是Index) // 0. 刚进入函数时 ...Table, ... <--- 这里栈顶 // 1. lua_pushnil(L) ...Table, ..., nil <--- 这里栈顶 // 2. lua_next(L, Index) ...Table, ..., Key, Value <--- 这里栈顶 // 3. lua_pushvalue(L, -2) ...Table, ..., Key, Value, KeyCopy <--- 这里栈顶 // 4. lua_pop(L, 2), ...Table, ..., Key <--- 这里栈顶 // ... 如此重复2,3,4 // N. lua_next(L, Index)返回0 ...Table, ... <--- 这里栈顶 /* ====================================================== */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值