我发现了问题的原因。答案已在下面发布。
编辑:问题已更改,请参阅“问题”部分。
我正在使用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#中的两个参数都是非空的。
答案 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)
也会失败。