我正在使用 Luainterface 2.0.3 将 Lua 嵌入到 c# 应用程序中。
一切正常,除了在 Visual Studio 的 Debug模式下,Lua 的打印功能不会写入控制台(也不会写入输出)。
using System;
using LuaInterface;
namespace Lua1 {
class Program {
static void Main(string[] args) {
Lua lua = new Lua();
lua.DoString("print 'Hello from Lua!'");
}
}
}
在非 Debug模式下运行它,打印工作正常。
我错过了什么吗?
谢谢!
最佳答案
不幸的是,您可能遇到了print()
中的一个已知缺陷。函数,它实际上是为了在控制台提示符下进行快速而肮脏的调试,并且缺少一些必要的灵 active 。
基础库函数print()
由 luaB_print()
in lbaselib.c 实现显式使用 C 运行时的 stdout
流作为其目的地。因为它引用了全局变量stdout
在其实现中明确地,重定向它的唯一方法是导致该文件句柄被重定向。在可以通过调用 freopen(stdout,...)
来完成的 C 程序中.不幸的是,Lua 中没有库函数可以做到这一点。io
库在 liolib.c 中实现.它使用函数环境来保存打开文件描述符表,并在初始化期间创建 file
名为 io.stdin
的对象, io.stdout
和 io.stderr
对于三个标准描述符。它还提供了名为 io.output
的函数。和 io.input
允许修改这两个描述符以指向任何打开的file
对象(如果传递了文件名,则为新打开的文件)。但是,这些函数只是改变函数环境表,并不调用freopen()
。修改 FILE
的 C 运行时表值(value)观。
我不知道 LuaInterface 如何尝试处理标准 C 运行时的 stdout
的想法.很可能是stdout
没有连接到 VS 调试器中任何有用的东西,因为它可能利用一些 .NET 功能来捕获正在调试的模块的输出,这些输出在任何情况下都可能与 C 不完全兼容。
也就是说,很容易替换标准 print
功能。只需使用 LuaInterface 的现有特性编写一个名为 print
的全局函数即可调用 tostring()
在每个参数上并将其传递给标准输出设备。
关于.net - 嵌入式 Lua "print"无法在 Visual Studio 的 Debug模式下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466064/