簡體   English   中英

嵌入式Lua“打印”在Visual Studio中無法在調試模式下工作

[英]Embedded Lua “print” not working in debug mode from 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!'");
       }
    }
}    

在非調試模式下運行, 打印工作正常。

我錯過了什么嗎?

謝謝!

不幸的是,你可能會遇到print()函數中已知的缺陷,它實際上是用於在控制台提示符下快速和臟調試,並且缺少一些必要的靈活性。

luaB_print()在lbaselib.c中實現的基本庫函數print()顯式地使用C運行時的stdout流作為其目標。 由於它在其實現中明確引用了全局變量stdout ,因此重定向它的唯一方法是使該文件句柄被重定向。 在C程序中,可以通過調用freopen(stdout,...)來完成。 不幸的是,Lua中沒有庫存庫功能可以做到這一點。

io庫在liolib.c中實現。 它使用函數環境來保存打開文件描述符的表,並在其初始化期間為三個標准描述符創建名為io.stdinio.stdoutio.stderr file對象。 它還提供了名為io.outputio.input函數,允許修改這兩個描述符以指向任何打開的file對象(如果傳遞文件名,則為新打開的文件)。 但是,這些函數只更改函數環境表,並且不調用freopen()來修改C運行時的FILE值表。

我不知道LuaInterface如何嘗試處理標准C運行時的stdout想法。 很可能stdout沒有連接到VS調試器中有用的任何東西,因為它可能利用某些.NET功能來捕獲正在調試的模塊的輸出,在任何情況下都可能與C不兼容。

也就是說,更換標准print功能很容易。 只需使用LuaInterface的現有功能編寫一個名為print的全局函數,該函數在每個參數上調用tostring()並將其傳遞給任何.NET標准輸出設備。

我沒有使用LuaInterface,所以我不能肯定地說,但你可能想嘗試手動調用

io.output(io.stdout)

看看Lua ch 21.1中的Programming ,他們解釋了如何通過設置io.output來重定向print輸出的位置。 另請參閱IO庫教程

我不確定這是否會真正解決問題,因為我找不到與在Google Code上的LuaInterface源中設置的io.output相關的任何內容。

這里的代碼示例如何使用LuaInterface中使用的LuaDLL類重定向lua print函數:

// 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;
}

在C#中初始化lua看起來像:

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));

替換文件“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

並使用MSVCRT的調試版本重新編譯lua。 之后,您的輸出將按預期重定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM