[英]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.stdin
, io.stdout
和io.stderr
file
對象。 它還提供了名為io.output
和io.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.