当前位置 : 主页 > 网络编程 > lua >

.net – 嵌入式Lua“打印”无法​​在Visual Studio的调试模式下工作

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在使用Luainterface 2.0.3将Lua嵌入到c#应用程序中. 一切都运行正常,除了在Visual Studio的调试模式下,Lua的打印功能不会写入控制台(也不会写入输出). using System;using LuaInterface;namespace Lua1
我正在使用Luainterface 2.0.3将Lua嵌入到c#应用程序中.

一切都运行正常,除了在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标准输出设备.

网友评论