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