我使用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()
函数,这实在是用于快速和肮脏的调试在控制台提示符下,并缺少一些必要的灵活性。
基础库函数print()
通过实施luaB_print()
在lbaselib.c明确使用C运行时的stdout
流作为其目的地。 因为它指的是全局变量stdout
明确其执行并重定向它的唯一方法就是使与文件句柄重定向。 在可以通过调用来完成一个C程序freopen(stdout,...)
不幸的是,没有在Lua一级股票库功能,可以做到这一点。
该io
库中实现liolib.c 。 它使用功能环境保持打开的文件描述符的表,它的初始化过程中它会创建file
命名对象io.stdin
, io.stdout
和io.stderr
三个标准描述。 它还提供了一个名为功能io.output
和io.input
允许这两个描述符被修改为指向任何打开的file
(如文件名传递或新打开的文件)的对象。 然而,这些功能只改变功能环境表,不调用freopen()
修改的C运行时的表FILE
值。
我不知道如何LuaInterface试图治疗的标准C运行时的想法stdout
。 它很可能是stdout
没有连接到在VS调试器有用的东西,因为它可能需要一些.NET功能的优势捕捉来自正在调试模块输出,可能无法全部用在任何情况下I²C兼容。
这就是说,它是易于更换的标准print
功能。 只需使用LuaInterface的现有功能编写一个全局函数命名print
调用tostring()
对每个参数,并将其传递到任何.NET的东西是标准的输出设备。
我没有使用过LuaInterface,所以我不能肯定地说,但你可能想尝试手动调用
io.output(io.stdout)
看着在Lua CH 21.1编程 ,他们解释道,你如何重定向print
的输出会通过设置io.output。 又见IO库教程 。
我不能确定这是否会真正解决这个问题,但是,因为我找不到io.output中设定任何有关谷歌代码的LuaInterface源 。
下面一个代码示例如何使用在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));
在文件 “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的调试版本。 在此之后如预期的输出将被重定向。