C#和Lua——当前的选择?

我开发了一个使用 Mono 实现的 LuaInterface 应用程序,在 Linux 上运行得非常优秀,没有任何问题。但是我无法让 LuaInterface 在 Windows 版本的应用程序上工作。我已经花了两天时间尝试让它工作,但我感觉我可能忽略了一些基本的东西。

现在的“最新版”LuaInterface 是编译为早期版本的.NET,并不适用于4.0。我找到了一个链接,指向一个针对4.0编译的 .dll,但该链接已经失效。我试图获取 LuaInterface 的源代码并自己进行4.0的编译,但是 Visual Studio 2010 无法打开该方案,因为项目类型不受支持(或类似的错误)。

我尝试了 MonoLuaInterface 的 Windows 版本,虽然作者说它适用于 Windows,但实际上并不适用于 Windows。我反复遇到的错误是,无论我怎么做,程序都无法检测到 luanet.dll。我试图将其放到可执行文件的相同目录下,也试图在启动时设置 LUA_PATH 和 LUA_CPATH,但无论发生什么,程序在第一次提到 luanet.dll 时都会停止运行。我甚至无法让示例项目构建,因为它们无法找到 luanet.dll,就像被卡住一样。

我也尝试过 NLua,但是那简直是噩梦。

所以我的问题是:有没有人知道任何其他(可用的)在.NET上实现Lua的方法?如果需要,我可以重写大部分的粘合代码,我只需要让它正常工作。或者,有人能告诉我有关 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)

所以我更接近找到解决方法了,但我仍然不知道该去哪里修复它。

点赞
用户2502519
用户2502519

我在 #mono 的讨论中找到了这个宝石。

https://github.com/cdhowie/Eluant

2013-10-27 11:59:10
用户1723596
用户1723596

免责声明:我是这篇文章的作者。

你可以看看 MoonSharp (http://www.moonsharp.org)。它是一个完全用C#编写的Lua解释器,适用于 .NET 3.5及更高版本(可以在Mono和Unity上运行),并且它包括一个远程调试器,可以通过Web浏览器调试嵌入在你的程序中的脚本(因此它也适用于全屏游戏和Windows服务)。

2014-11-07 23:15:22
用户1575144
用户1575144

即使 LuaInterface 编译到了 3.5 版本,你仍然可以在 .NET 4 中使用。

只需在 app.config 文件中添加 useLegacyV2RuntimeActivationPolicy="true"

<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>
2015-01-22 20:13:08