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)
所以我更接近找到解决方法了,但我仍然不知道该去哪里修复它。
免责声明:我是这篇文章的作者。
你可以看看 MoonSharp (http://www.moonsharp.org)。它是一个完全用C#编写的Lua解释器,适用于 .NET 3.5及更高版本(可以在Mono和Unity上运行),并且它包括一个远程调试器,可以通过Web浏览器调试嵌入在你的程序中的脚本(因此它也适用于全屏游戏和Windows服务)。
即使 LuaInterface 编译到了 3.5 版本,你仍然可以在 .NET 4 中使用。
只需在 app.config 文件中添加 useLegacyV2RuntimeActivationPolicy="true":
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我在 #mono 的讨论中找到了这个宝石。
https://github.com/cdhowie/Eluant