如何使用C#将表格传递给Lua

如何使用 c# 向 lua 传递表

我正在使用 LuaInterface,以下是我的 c# 代码:

  using System;
  using System.IO;
  using System.Text;
  using LuaInterface;

  namespace GetLuaTable
  {
      class Program
      {
          static void Main(string[] args)
          {

              Lua netLua = new Lua();

              CShaprFunction cShapr = new CShaprFunction();
              netLua.RegisterFunction("CShaprConsoleLine", cShapr, cShapr.GetType().GetMethod("CShaprConsoleLine"));
              netLua.RegisterFunction("CSharpGetTableFromStr", cShapr, cShapr.GetType().GetMethod("CSharpGetTableFromStr"));
              netLua.DoFile("MyLua.lua");
              netLua.GetFunction("main").Call();
              Console.ReadKey();
          }
      }
      class CShaprFunction
      {
          public void CShaprConsoleLine(object obj)
          {
              Console.WriteLine(obj);
          }
          public LuaTable CSharpGetTableFromStr(string name)
          {
              Lua lua = new Lua();
              lua.DoString("a={\"test\"}");
              LuaTable tab = lua.GetTable(name);
              return tab;
          }
      }
  }

以下是 lua 代码:

  function main()
    CShaprConsoleLine("Start")
    local tmptable = CSharpGetTableFromStr("a")
    CShaprConsoleLine(type(tmptable))
    CShaprConsoleLine("end")
  end

但是我得到了以下结果,tmptable 是函数类型而不是表类型。就像这样:

Start
function
end

所以,我该如何向 lua 传递表?

点赞
用户98917
用户98917

在这个例子中,你需要在 Program 和 CShaprFunction 中使用相同的 Lua 对象才能使其正常工作,因为它在 Lua 环境中创建 Lua 表,你不能直接将 Lua 表移动到另一个环境中。

下面是一个能运行的例子:

Start
table
end

我使用了 NLua,它是 LuaInterface 的继任者,仍然在更新,因为我在使用 LuaInterface 时遇到了一些问题,但在 LuaInterface 中应该也能正常工作。

using System;
using System.IO;
using System.Text;
using NLua;

namespace GetLuaTable
{
    class Program
    {
        public static Lua netLua;

        static void Main(string[] args)
        {

            netLua = new Lua();

            CShaprFunction cShapr = new CShaprFunction();
            netLua.RegisterFunction("CShaprConsoleLine", cShapr, cShapr.GetType().GetMethod("CShaprConsoleLine"));
            netLua.RegisterFunction("CSharpGetTableFromStr", cShapr, cShapr.GetType().GetMethod("CSharpGetTableFromStr"));
            netLua.DoString(@"
            function main()
                CShaprConsoleLine(""Start"")
                local tmptable = CSharpGetTableFromStr(""a"")
                CShaprConsoleLine(type(tmptable))
                CShaprConsoleLine(""end"")
              end
            ");
            netLua.GetFunction("main").Call();
            Console.ReadKey();
        }
    }
    class CShaprFunction
    {
        public void CShaprConsoleLine(object obj)
        {
            Console.WriteLine(obj);
        }
        public LuaTable CSharpGetTableFromStr(string name)
        {
            var lua = Program.netLua;
            lua.DoString("a={\"test\"}");
            LuaTable tab = lua.GetTable(name);
            return tab;
        }
    }
}
2015-01-15 22:15:20