在浏览了各种 C# 的 Lua 解释器之后,似乎只有一个是真正的纯 c# - MoonSharp。后来成为 NLua 的 LuaInterpreter(从 2009 年起已停用)依赖于其他两个 c# 库之一 KeraLua 或另一个库,并且需要自定义的 lua52.dll(您不能使用来自 lua.org 的那个)。他们有一个已关闭的错误报告,上面写着查看自述文件以获取他们定制的 lua52.dll 的下载位置,但它不存在。您被迫从各种来源下载这些库,并祈祷它们一起工作,此外还有一个多文件分发,由于最终用户计算机上的几个 lua52.dll 变体(假设他们将使用不仅仅是你的程序)。
NLua 上一个闪亮的灯塔是它显然很受欢迎,但是该项目几年来没有收到任何重大更新。另一方面,MoonSharp 似乎是完全独立的,但缺乏常见任务的文档,例如加载使用 lua 构建的表并使用它。
我根据他们在 Git 上提供的单个示例提出了以下代码,然后在他们的网站上复制了 moonsharp.org(以先到者为准,我不确定,但只有 1 个示例还不够):
using System;
using System.IO;
using MoonSharp.Interpreter;
class Foo {
function Bar( string accountName, string warcraftPath ) {
string datastore = Path.Combine(warcraftPath, "WTF", "Account", accountName, "SavedVariables", "DataStore_Containers.lua";
DynValue table = Script.RunString( File.ReadAllText( datastore ) );
Console.WriteLine( table.Table.Keys.Count().ToString() );
}
}
结果如下(图片中的代码略有不同,因为我在此处调整了粘贴的代码以保持清洁,并使您更容易使用下面 pastebin 链接中的表格数据重现问题。)
我正在尝试阅读的表格如下所示(由于大小超过 30,000 个字符,因此必须在 pastebin 上进行简化):
魔兽世界 - Datastore_Containers Lua 表示例数据
我有某种工作,它有点hackish,但似乎并没有离开遍历值或显式获取子表/值或值的键。
Script s = new Script(CoreModules.Preset_Complete);
// hacked by appending ' return DataStore_ContainersDB ' to return the table as DoString seems to only work to run a function expecting a result to be returned.
DynValue dv = s.DoString(luaTable + "\nreturn DataStore_ContainersDB;");
Table t = dv.Table;
foreach(var v in t.Keys)
{
Console.WriteLine( v.ToPrintString() );
}
问题是我似乎没有任何方法可以输入子表结果集或显式访问类似t["global"]
or的结果集t.global
。