我创建了一个使用 LuaInterface 的 Mono 实现的应用程序,它在 Linux 上运行良好,没有任何障碍。我根本无法让 LuaInterface 与我的应用程序的 Windows 版本一起工作。我花了整整两天的时间试图让它发挥作用,我觉得我错过了一些非常基本的东西。
“最新”的 LuaInterface 是针对早期版本的 .NET 编译的,不适用于 4.0。我找到了一个指向针对 4.0 编译的 .dll 的链接,但该链接已失效。我尝试获取 LuaInterface 源并自己针对 4.0 进行编译,但 Visual Studio 2010 无法打开解决方案,因为不支持项目类型(或某些错误)。
我已经为 Windows 版本尝试过 MonoLuaInterface;尽管作者说它可以在 Windows 上运行,但显然不能。我一直遇到的错误是,无论我做什么,我都无法让程序检测到 luanet.dll。我试过把它放在与可执行文件相同的目录中,我试过设置LUA_PATH
和LUA_CPATH
启动,不管发生什么,它只是在第一次提到 luanet.dll 时抛出。我什至无法构建示例项目;他们找不到 luanet.dll 并且只是死在水中。
我也尝试过 NLua,那简直就是一场噩梦。
所以我的问题是:有没有人知道 Lua 在 .NET 上的任何其他(工作)实现?如果必须,我会重写大部分胶水代码,我只需要让它工作。或者,任何人都可以向我指出 luanet.dll 问题的一些解决方案,甚至是 LuaInterface 源问题的答案吗?
我知道这是一个非常广泛的问题,但我完全迷失了,完全不知道从哪里开始尝试解决这个问题。提前感谢任何有任何想法的人。
好的,我已经取得了一些进展。我再次尝试了NLua,并记住了它的问题。经过一些实验,这就是我发现的。
我使用的 Lua 脚本通过一个名为 EventManager 的导入类型与程序的其余部分交互,该类型在相关脚本的开头加载。EventManager 是一个单例,我立即使用代码分配实例:
EVENTMANAGER = luanet.import_type("Program.EventManager")
Event = EVENTMANAGER.Instance
从那时起,我在代码中使用 Event:whateverfunction() 调用公开的方法。如果我使用 NLua 的 DoString() 方法调用代码,这实际上可以正常工作。当我尝试在 Lua 端的协程中调用这些方法时,问题就出现了,这就是所有内容的实际编写方式。当我这样做时,NLua 会抛出 NullReferenceException。堆栈跟踪如下:
System.NullReferenceException at NLua.MetaFunctions.GetMethod(LuaState luaState)
at KeraLua.NativeMethods.LuaNetPCall(IntPtr luaState, Int32 nArgs, Int32 nResults, Int32 errfunc)
at KeraLua.Lua.LuaNetPCall(IntPtr luaState, Int32 nArgs, Int32 nResults, Int32 errfunc)
at NLua.LuaLib.LuaPCall(LuaState luaState, Int32 nArgs, Int32 nResults, Int32 errfunc)
at NLua.Lua.DoString(String chunk, String chunkName)
所以我更接近于解决这个问题,但我仍然不知道去哪里解决这个问题。