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