尝试“修复”LuaInterface时出现DllNotFoundException错误,但为什么?

3

由于我的游戏,我非常希望它能够在Mono下使用,但看起来由于LuaInterface很顽固(参见相关的SO讨论),它似乎无法在Linux下运行。因此,我决定按照那里提出的建议去做。我编写了自己的Lua511.LuaDLL类,反映了LuaInterface所使用的类,并用相应的lua51的DllImport替换了每个公共函数:

//For example, like this:
[DllImport("lua51")]
public static extern IntPtr luaL_newstate();

通过编辑后的LuaInterface.dll(现在它拥有自己的Lua511.LuaDLL)以及一个纯粹的、本地的Win32 lua51.dll放在我的游戏启动文件夹中,当LuaInterface尝试初始化时,我不知何故会出现DllNotFoundException:

public Lua()
{
   luaState = LuaDLL.luaL_newstate(); //right there, right then.
   ...

当然,由于DLL就在那里,它不应该这样做,对吧?奇怪的是,重新放回被搞砸的lua51.dll .Net版本会导致EntryPointNotFoundException。这真是让人费解。
那么这是怎么回事呢?
相关源代码:Lua511.cs,将其放入LuaInterface项目中,然后删除引用,以便替换它。
编辑:算了,我要寻找替代方案。或者自己动手。或者干脆不再关心Linux兼容性。
2个回答

4
您引用了我的问题。我选择了另一种方式来解决这个问题,并开始开发一个新的Lua .NET接口,我称之为Lua4Net。
您可以在Google托管上找到源代码,以及这里的单元测试
目前实现的功能包括:执行带有异常处理的代码并提供返回值;注册具有参数处理的全局函数。
即将推出的功能包括:获取/设置全局变量;调试支持等。
您可以在此处找到使用的本地Windows DLL(它是从此处重命名的VC++ 9.0 DLL)。
另外:今天我进行了第一次Linux/Mono测试,所有的单元测试都通过了!!!

1

据我所知,Mono在Linux下默认使用.so扩展名作为本地库的扩展名。

尝试将你的lua51.dll重命名为lua51.so或者更改DllImport属性中的dllname。或者使用dllmap。


额,不是的。实际上我是在 Windows 下运行这个程序的。而且 DllImport 没有指定扩展名。 - Kawa
哦,抱歉,我误解了。我使用Dependency Walker检查了LuaInterface中的lua51.dll,并发现它没有导出任何函数。然后我从源代码重新构建了lua51。它开始加载,但在函数上出现EntryPointNotFoundException错误(在.NET和Mono上都是如此)。这是正常的,因为没有这样的函数-这是在lua.h中定义的一个宏,定义在lua_createtable的顶部。对于lua.h中的许多其他“函数”也是如此。因此,我认为您应该将它们的dll导入替换为对实际函数的调用,这样您就有机会使LuaInterface正常工作了。 - elder_george
我已经编辑了你的文件lua511.cs,以运行简单的脚本。请参见此处http://pastie.org/659584。希望这能有所帮助。 - elder_george

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接