Как передать стол Луа с помощью C#

Как передать стол Луа с помощью C#

Я использую 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

так как я могу передать стол Луа?

1 ответ

Решение

Вы должны использовать то же самое Lua объект в Program и CShaprFunction для правильной работы, потому что он создает таблицу 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;
        }
    }
}
Другие вопросы по тегам