问题标签 [nlua]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
601 浏览

c# - 如何将对象列表从 C# 传递和迭代到 NLua

我应该如何将对象列表从 C# 传递和迭代到 Lua?

我的示例带有一个数组int,当我使用自定义类时,我得到了相同的结果:

脚本在哪里

输出是:

它跳过了第一个,我得到了异常:“索引超出了数组的范围。” 我的代码有什么问题?

0 投票
1 回答
651 浏览

nlp - Rasa 调用外部 API 抛出 NONE

我使用 rasa 构建了一个小型聊天机器人。我希望我的机器人通过调用外部 api 来讲笑话,但我得到 None 作为响应。

我在这里附上 API 调用方法。

在我的 domain.yml 我有笑话响应槽

在我尝试使用主要和直接指定“-action_get_jokes”的操作下,但它们都不起作用。

0 投票
1 回答
134 浏览

lua - LUA 5.2: Load/Require/etc - 将其限制为可以加载的特定目录

我正在尝试在我的游戏中保护 LUA(玩家可以在 LUA 中创建脚本)。我已经删除了许多函数来创建各种沙箱(os.execute例如,AKA 删除函数。)但是,我的游戏确实使用从其他位置加载脚本来减少编码冗余。又名:

require("Scripts/Additional/Crafting")在文件的顶部。

对我来说,这很好,但我不知道将 require/load/file.read() 保留为没有限制的影响,或者如果可能覆盖它,以便他们无法从外部加载或读取文件服务器。

现在我正在使用 NLUA (C#) 和 LUA5.2。我在创建 LUA 状态时删除了这些功能。

我想做的是保留 LOAD/REQUIRE/etc,但事先通过初始检查覆盖它,以确保它们位于 SCRIPT 目录中。新函数本身不可编辑(因为我将使用 NLUA 在 C# 中对其进行硬编码,或者在他们无法访问的文件夹之外创建一个单独的文件)。

或者,我可以通过 C# 对这些函数的脚本进行快速检查,并使用 REGEX 验证它们使用的目录,但我想知道 LUA 是否可以自己处理它。

抱歉,如果没有正确解释。

0 投票
0 回答
171 浏览

lua - 获取 Lua 脚本错误,称为:未知 Lua 脚本错误

我的 Lua 脚本对我来说很好,但有些人遇到了问题。

他们不断收到此错误:

查看我的脚本,正是这里的这部分给出了错误:

有些人通过将脚本和运行 Lua 脚本的软件移动到他们的 C: 驱动器来解决这个问题。其他人仍然有这个问题,即使以管理员身份运行,但我被告知这可能是因为他们的系统语言不是英语。

有谁知道为什么会导致这种情况?就像我说的那样,它对我来说运行良好。(使用 Windows 10)

0 投票
1 回答
138 浏览

lua - setmetatable 到底是什么,出于安全原因,我该如何避免它?

通常沙盒会阻止 setmetatable,如下所示:

问题是,我不想使用 setmetatable。它到底是什么,我将如何解决它?在上述情况下,它只是一个作为复制“mt”变量的全局变量吗?我应该做些什么具体的事情吗?

谢谢。

0 投票
1 回答
334 浏览

c# - 终止 NLua 脚本执行

我正在使用 NLua 在我的应用程序中运行 Lua 脚本。我需要实现随时终止在单独线程中运行的脚本的能力,例如用户按下“停止”按钮并且脚本必须立即终止。我已经阅读了 SetDebugHook 并尝试关闭 Lua 状态并在状态上调用错误,但我总是得到 AccessViolationException。

我试过了

试图用锁同步线程

同样的问题。AccessViolationException

谢谢。

0 投票
0 回答
87 浏览

c# - 我无法使用 Nuget Nlua 在 C# 中读取 .lua 文件

将 Visual Studio 与类应用程序一起使用,我通过 NuGet 添加了 NLua。我想读入 .lua 文件(顺便说一句,有更好的方法让我知道)我的代码是这样的:

但是当我运行它时,我在上面的行中遇到了一个异常:

System.BadImageFormatException HResult=0x8007000B 消息=尝试加载格式不正确的程序。(HRESULT 异常:0x8007000B) Source=KeraLua StackTrace:在 KeraLua.NativeMethods.luaL_newstate() 在 NLua.Lua..ctor()

我究竟做错了什么?我试图搜索互联网并提出了解决方案,因为我正在运行一个 64 位应用程序,而我正在尝试以 32 位加载(NLUA)的应用程序。是这样吗?

谢谢你

0 投票
1 回答
260 浏览

c# - 我可以创建一个没有 Lua 函数名称的 NLua.LuaFunction 吗?

我正在尝试创建一个评估字符串并为其中包含的函数返回 LuaFunction 对象的方法。这些字符串将由用户输入,因此我无法事先知道函数的名称。示例字符串:

我希望 LuaFunction 指向doSomething.

我能够使用正则表达式来捕获函数的名称,然后使用 NLua.Lua.GetFunction 但这不适用于函数中的函数。

现在我的代码使用 KeraLua.Lua.LoadString 并为 LoadString 创建的块返回一个 LuaFunction。这种工作,但这意味着 LuaFunction 不能接受 args。

这个答案与我想要的类似,但我不能像它显示的那样强制函数成为表的成员。

0 投票
0 回答
128 浏览

c# - 我可以在 Nlua 中使用静态类吗?

首先,我不是以英语为母语的人,对于这个问题可能产生的任何沟通错误,我深表歉意。另外,不能真正理解你提出问题的一些指导方针,所以按照我对它的理解。因此,如果我违反了任何习俗,请告诉我。

背景

我一直在制作一个尝试为代码实现 xaml hot reload 之类的应用程序。由于我不能直接使用像 c# 这样的编译语言来实现它,我决定我将依赖第三方脚本语言,认为我可以在其中编写一些我的应用程序逻辑,然后更快地将其部署到设备上,因为我会只需按一个按钮即可发送代码。因此,可以将其想象为 react-native 世界中的 expo 客户端。

我决定使用 lua 作为脚本语言,不仅因为它编写代码非常简单,还因为它对 .net 有很好的绑定,当然我说的是 Nlua。而且,由于 Ironpython3 还没有准备好投入生产,老实说我有什么选择?

我面临的问题

因此,由于我必须绑定一些 xamarin.essentials 内容以使我更轻松地编写应用程序的 lua 端,因此我必须与一些具有静态方法等的对象进行交互。我认为在 Nlua 中使用静态方法会非常直观和直接,尽管到目前为止我似乎错了。

如何重现问题

  1. 因此,在 Visual Studio 中,创建一个 xamarin.forms 项目,随意命名,没关系。
  2. 接下来,将 Nlua nuget 包添加到所有项目中。它需要集成到所有这些中,因为它与某些 xamarin.forms 插件一样,依赖本机库来工作,因此需要将它们包含在适当的位置以便操作系统找到它们。当安装在受支持的项目类型中时,这是由包自动完成的,所以这样做。
  3. 将 Nlua 命名空间添加到 MainPage 内容页面的代码隐藏顶部,如下所示:
  1. 为了方便以后使用,向 MainPage 类添加一个类级别的属性,如下所示:
  1. 现在,为简单起见,在页面构造函数中对其进行初始化:
  1. 在页面的 xaml 中,添加一个用于输入文本的编辑字段和一个能够运行它的按钮:
  1. 在按钮单击处理程序中,添加代码以加载编辑框中的内容,然后让 nlua 执行它,如下所示:
  1. 现在,添加一个新类,随心所欲地调用它,我叫我的 tts。删除文件与生成的所有内容,然后在其中添加以下内容:
  1. 回到主内容类,无论是在构造函数中还是在从构造函数调用的专用方法中,注册 lua 类型,如下所示:

预期行为

如果使用符号,它应该说出赋予函数的参数.,例如 tts.speak("hello world")

实际行为

当执行带有.符号的调用时,lua 解释器会抛出以下错误:

[string "chunk"]:1: 尝试调用一个 nil 值(字段 'speak')。

到目前为止我尝试了什么

  1. 首先,我尝试使用 typeof 关键字获取静态对象的类型,然后将其直接注册为 lua 可访问值,如上所示。如您所见,这引发了错误。
  2. 例如,如果我尝试像函数一样调用类型来获取文档中显示的新对象,它会再次失败。
  3. 如果我使用该State.UseClrPackage();方法,然后手动导入这些东西,它也不起作用,无法访问任何方法或变量,lua 说它们都是“空的”。

注意:经过仔细检查,我发现变量 lua sees 实际上是真正的 clr 类型,因为 lua 的 str 函数显示了完整的类型限定符,如 .net 中所示。但是,type 函数返回 userdata。

  1. 我没有让整个类型对 lua 可见,而是尝试使用名称创建一个 lua 表,然后添加键值对,其中键是方法名称,值是静态对象的方法,如返回通过 typeof(thing).GetMethod(MethodName) 强制转换为 LuaFunction 类型。这在一定程度上奏效了,尽管它很快对我来说太复杂和难以承受,所以我停止使用这种方法,因为我的代码库非常复杂。

  2. 我尝试的另一件事是为静态对象制作代理对象,其中实际上没有什么是静态的,即使这些方法返回 void 并作用于静态属性。

再一次,这有点工作,但是当静态方法的规范是 object.thing 时,我必须使用 object:thing。如果我尝试使用 object.thing 表示法,我会得到一个很长的错误,尽管我确信它的内容与手头的问题无关,所以不会在这里包含它。

结论

所以,正式地,我尽我所能,甚至在这里搜索,看看我是否能找到任何启​​发我的东西,但不幸的是没有运气。现在,你推荐我用什么?有什么我忽略的地方吗?

0 投票
1 回答
140 浏览

c# - 如何从 Lua 调用 C# 委托,委托可以抛出异常

在基于 Linux 的 docker 映像中运行以下代码会导致 CLR 崩溃。

难道我做错了什么?

Dockerfile 是 Visual Studio 的默认建议,进程是从 Visual Studio 启动的。

在 Docker 之外运行程序,即。在 Windows 主机上,按预期工作。(命中 catch 块并且不会导致 CLR 上的致命情况)

将调用包装在 apcall中并不能解决问题。

可以通过注册函数而不是发送委托来避免这个问题。如果委托没有抛出异常,它将按预期调用。

图片中的控制台日志;