嵌入式Lua"打印"在Visual Studio中无法在调试模式下工作

Oli*_*Oli 3 .net lua embedded-language visual-studio

我正在使用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!'");
       }
    }
}    
Run Code Online (Sandbox Code Playgroud)

在非调试模式下运行,打印工作正常.

我错过了什么吗?

谢谢!

RBe*_*eig 8

不幸的是,你可能会遇到print()函数中已知的缺陷,它实际上是用于在控制台提示符下进行快速和脏调试,并且缺少一些必要的灵活性.

lbaselib.c中print()实现的基本库函数显式使用C运行时的流作为其目标.由于它在其实现中明确引用全局变量,因此重定向它的唯一方法是使该文件句柄被重定向.在C程序中,可以通过调用来完成.不幸的是,Lua中没有库存库功能可以做到这一点.luaB_print()stdoutstdoutfreopen(stdout,...)

io库在liolib.c中实现.它使用函数环境来保存打开文件描述符的表,并在其初始化期间创建file名为的对象io.stdin,io.stdout以及io.stderr三个标准描述符.它还提供了命名的函数,io.outputio.input允许修改这两个描述符以指向任何打开的file对象(如果传递文件名,则指向新打开的文件).但是,这些函数只更改函数环境表,不调用freopen()修改C运行时的FILE值表.

我不知道LuaInterface如何尝试处理标准C运行时的想法stdout.很可能stdout是因为它没有连接到VS调试器中有用的任何东西,因为它可能利用某些.NET功能来捕获正在调试的模块的输出,在任何情况下都可能与C不兼容.

也就是说,更换标准print功能很容易.只需使用LuaInterface的现有功能编写一个名为print调用tostring()每个参数的全局函数,并将其传递给任何.NET标准输出设备.