将任意参数从C#传递给Lua函数

时间:2014-04-02 16:43:01

标签: c# lua luainterface

我发现了问题的原因。答案已在下面发布。


编辑:问题已更改,请参阅“问题”部分。

我正在使用LuaInterface。使用此库的lua函数的泛型调用具有此签名LuaFunction.Call(params object[] args)。我创建了一个包装器函数,它捕获库中的异常并将它们格式化以便在游戏控制台窗口中显示。

我正在尝试调用lua函数,但它没有接收参数。这是C#

中的一行
Game.Instance.scriptEngine.Call("GenerateChunk", chunks[chunkID], GetChunkGridPosition(chunkID));

这只是包含对这个接受两个参数的Lua函数的调用:

//lua
function GenerateChunk(worldChunk, chunkGridPosition)
    Log(LogLevel.Error, worldChunk.ToString());
    Log(LogLevel.Error, chunkGridPosition.ToString());
end

只是回调到C#Log函数(它正确解析,并在Lua上下文中可见)。

问题是我在尝试调用"invalid arguments to method call"函数时从luainterface收到GenerateChunk错误,将其丢回:


invalid arguments to method call
   at JASG.ScriptEngine.LuaError(Exception ex) Scripting\ScriptEngine.cs:line 144
   at JASG.ScriptEngine.Call(String fnName, Object[] args) Scripting\ScriptEngine.cs:line 86
   at JASG.ChunkManager.WakeChunk(Int32 chunkID) World\ChunkManager.cs:line 123
   at JASG.ChunkManager.GetChunk(Int32 chunkID, Boolean wakeIfAsleep) World\ChunkManager.cs:line 53

我尝试了各种调用ScriptEngine.Call方法的方法,尝试将参数包装在object []数组中,但没有骰子。任何想法为什么卢阿没有收到我的论点,我正在通过?我已经验证了传入时C#中的两个参数都是非空的。

3 个答案:

答案 0 :(得分:0)

我之前从未使用过Lua,但是我在调​​用COM对象(或任何互操作)时看到了这种奇怪的行为,或者当目标程序集调用加载到不同的App域或任何其他技术上时将.Net程序集与非网络程序进行相互通信。

您是否尝试在定义“chunks [chunkID]”和“GetChunkGridPosition(chunkID)”结果的类上使用[Serializable]属性?两个程序集之间的所有互操作类和类型是否兼容?

在这里大声思考。

答案 1 :(得分:0)

旁注:您应将代码缩减为shortest example that produces the problem。例如,我们不需要查看您的包装函数。你应该尝试删除它。如果这解决了问题,那么你应该提到一个重要的线索。如果问题仍然存在,那么对于阅读此问题的人来说,该代码只是一种令人分心的无关紧要。

您的问题可能出在您的Log功能中。其他一切看起来都不错,这是我们能够实际看到的唯一代码,您的问题可以像这样重现:

public static void Log(int errorLevel, string message)
{
    Console.WriteLine(message);
}

public void Test()
{
    var lua = new Lua();
    lua.RegisterFunction("Log", this, GetType().GetMethod("Log"));
    lua.DoString("function foo() Log('a','b') end");
    lua.GetFunction("foo").Call();
}

在这种情况下,因为' a'不能编组成一个数字。

答案 2 :(得分:0)

我错误地将问题识别为调用Lua。我收到的错误消息实际上是源于回调到我的C#Log函数的Lua脚本。

我发现了尽管将枚举LogManager.LogLevel暴露给lua脚本环境但 Lua不支持枚举类型的困难方式。因此,

Log(LogLevel.Debug, "hello"); 

正在变成

Log("Debug", "hello");

当由LuaInterface为C#函数编组时。直到我创建了一个辅助ScriptLog(string level, string msg),我才能在lua中正确使用该函数。我想保留能够在Lua中使用枚举名称的功能。

注意:由于Lua不支持枚举类型,tonumber(LogLevel.Debug)也会失败。