嵌入式Lua的“打印”在调试模式下从Visual Studio工作(Embedded Lua “pr

2019-07-19 04:05发布

我使用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!'");
       }
    }
}    

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

我缺少的东西吗?

谢谢!

Answer 1:

不幸的是,你可能行动反对已知缺陷print()函数,这实在是用于快速和肮脏的调试在控制台提示符下,并缺少一些必要的灵活性。

基础库函数print()通过实施luaB_print()在lbaselib.c明确使用C运行时的stdout流作为其目的地。 因为它指的是全局变量stdout明确其执行并重定向它的唯一方法就是使与文件句柄重定向。 在可以通过调用来完成一个C程序freopen(stdout,...) 不幸的是,没有在Lua一级股票库功能,可以做到这一点。

io库中实现liolib.c 。 它使用功能环境保持打开的文件描述符的表,它的初始化过程中它会创建file命名对象io.stdinio.stdoutio.stderr三个标准描述。 它还提供了一个名为功能io.outputio.input允许这两个描述符被修改为指向任何打开的file (如文件名传递或新打开的文件)的对象。 然而,这些功能只改变功能环境表,不调用freopen()修改的C运行时的表FILE值。

我不知道如何LuaInterface试图治疗的标准C运行时的想法stdout 。 它很可能是stdout没有连接到在VS调试器有用的东西,因为它可能需要一些.NET功能的优势捕捉来自正在调试模块输出,可能无法全部用在任何情况下I²C兼容。

这就是说,它是易于更换的标准print功能。 只需使用LuaInterface的现有功能编写一个全局函数命名print调用tostring()对每个参数,并将其传递到任何.NET的东西是标准的输出设备。



Answer 2:

我没有使用过LuaInterface,所以我不能肯定地说,但你可能想尝试手动调用

io.output(io.stdout)

看着在Lua CH 21.1编程 ,他们解释道,你如何重定向print的输出会通过设置io.output。 又见IO库教程 。

我不能确定这是否会真正解决这个问题,但是,因为我找不到io.output中设定任何有关谷歌代码的LuaInterface源 。



Answer 3:

下面一个代码示例如何使用在LuaInterface使用的LuaDLL类重定向LUA打印功能:

// See http://medek.wordpress.com/2009/02/03/wrapping-lua-errors-and-print-function/
static int LuaPrint(IntPtr L)
{
  int nArgs = LuaDLL.lua_gettop(L);
  LuaDLL.lua_getglobal(L, "tostring");
  string ret = ""; //this is where we will dump the output
  //make sure you start at 1 *NOT* 0
  for(int i = 1; i <= nArgs; i++)
  {
      LuaDLL.lua_pushvalue(L, -1);
      LuaDLL.lua_pushvalue(L, i);
      LuaDLL.lua_call(L, 1, 1);
      string s = LuaDLL.lua_tostring(L, -1);
      if(s == null)
          return LuaDLL.luaL_error(L, "\"tostring\" must return a string to \"print\"");
      if(i > 1) ret += "\t";
      ret += s;
      LuaDLL.lua_pop(L, 1);
  };
  //Send it wherever
  Console.Out.WriteLine(ret);
  return 0;
}

LUA的C#中的初始化是这样的:

IntPtr luaState = LuaDLL.luaL_newstate();
LuaDLL.luaL_openlibs(luaState);
LuaDLL.lua_newtable(luaState);
LuaDLL.lua_setglobal(luaState, "luanet");
Lua l = new Lua(luaState.ToInt64());
LuaDLL.lua_register(luaState, "print", new LuaCSFunction(LuaPrint));


Answer 4:

在文件 “LUA的/ etc / luavs.bat” 替换7号线

@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE

@set MYCOMPILE=cl /nologo /MDd /Od /W3 /c /D_CRT_SECURE_NO_DEPRECATE

并重新编译LUA与MSVCRT的调试版本。 在此之后如预期的输出将被重定向。



文章来源: Embedded Lua “print” not working in debug mode from Visual Studio