C# 和 Lua -- 当前选项



我创建了一个使用LuaInterface的Mono实现的应用程序,它在Linux上运行良好,没有任何障碍。 我根本无法让LuaInterface与我的应用程序的Windows版本一起工作。 我花了两天时间试图让它工作,我觉得我错过了一些非常基本的东西。

"最新"LuaInterface 是针对早期版本的 .NET 编译的,不适用于 4.0。 我打开了一个针对 4.0 编译的.dll的链接,但该链接已失效。 我试图获取LuaInterface源代码并针对4.0进行编译,但是Visual Studio 2010无法打开解决方案,因为不支持项目类型(或某些错误)。

我已经尝试过Windows版本的MonoLuaInterface;尽管作者说它可以在Windows上运行,但显然不能。 我一直遇到的错误是,无论我做什么,我都无法让 luanet.dll 被程序检测到。 我尝试将其放入与可执行文件相同的目录中,我尝试在启动时设置LUA_PATHLUA_CPATH,无论发生什么,它都会在第一次提到luanet.dll时抛出。 我什至无法构建示例项目;他们找不到Luanet.dll只是死在水里。

我也尝试了NLua,那只是一场噩梦。

所以我的问题是:有谁知道 .NET 上 Lua 的任何其他(工作)实现? 如果有必要,我会重写大部分胶水代码,我只需要让它工作。 或者,任何人都可以指出我luanet.dll问题的解决方案,甚至是LuaInterface源问题的答案吗?

我知道这是一个非常广泛的问题,但我完全迷失了,完全不知道从哪里开始尝试解决这个问题。 提前感谢任何有想法的人。


好的,我取得了一些进展。 我再次尝试了NLua,并记住了它的问题所在。 经过一番实验,这是我发现的。

我使用的 Lua 脚本通过导入的类型(称为 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)

所以我更接近解决这个问题,但我仍然不知道去哪里解决这个问题。

我在 #mono 的讨论中挖掘出来,我遇到了这个宝石。

https://github.com/cdhowie/Eluant

免责声明:我是作者。

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

即使编译为 3.5,您仍然可以在 .NET 4 中使用 LuaInterface。

只需在您的 app.config 中添加useLegacyV2RuntimeActivationPolicy="true"

<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>

最新更新