【发布时间】:2014-08-06 22:54:25
【问题描述】:
我有一个使用 Visual Studio 中的 Linux 游戏模板构建的 MonoGame 应用程序。它使用 .NET 或 Mono 在 Windows 上运行,但在 Linux 上失败。
错误是关于 SDL.dll 的 DllNotFoundException,但 SDL.dll 始终位于二进制文件的目录中。该文件不是 CLR 程序集,因此不在参考中。相反,我在构建期间从 MonoGame 的 Assemblies/Linux 目录复制了它(并且所有相关的 CLR 程序集也从该文件夹复制)。无论我是在 Visual Studio 或 Xamarin Studio 的 Windows 下还是在 MonoDevelop 的 Linux 下构建项目,都会出现错误。没有构建错误。
这是相关的堆栈跟踪:
System.DllNotFoundException: SDL.dll
at (wrapper managed-to-native) Tao.Sdl.Sdl:__SDL_InitSubSystem (int)
at Tao.Sdl.Sdl.SDL_InitSubSystem (Int32 flags) [0x00000] in <filename unknown>:0
at Microsoft.Xna.Framework.OpenTKGamePlatform..ctor (Microsoft.Xna.Framework.Game game) [0x00000] in <filename unknown>:0
at Microsoft.Xna.Framework.GamePlatform.Create (Microsoft.Xna.Framework.Game game) [0x00000] in <filename unknown>:0
at Microsoft.Xna.Framework.Game..ctor () [0x00000] in <filename unknown>:0
(我没有包含代码,因为这与我的代码无关 - 即使我从模板构建一个新项目也会发生这种情况。我已经在谷歌上搜索了几个小时并尝试了所有组合各种论坛上的建议,但我还没有找到解决方案。)
我能做些什么来解决这个问题?
附录: 使用MONO_LOG_LEVEL=debug,我可以看到运行时尝试定位 DLL,但他们都说找不到该文件。当我尝试通过将文件重命名为libSDL.dll(或它正在寻找的任何其他内容)来“帮助”运行时时,它会显示“无效的 ELF 标头”并忽略它。这可能是意料之中的,因为它看起来像一个 Win32 二进制文件(不是 CLR 程序集)。
【问题讨论】:
-
如果它不是一个 CLR 程序集(我同意,它可能不是),那么它就是一个 Windows 格式的 PE 可执行文件。 Linux 本身无法识别这一点,您需要配置 Wine 集成以让 Mono 加载它。即使这样,它也可能会或可能不会正确运行。也许你可以得到一个导出相同函数的 libSDL.so 文件?
-
@BenVoigt 我刚刚发现了问题所在,现在给出答案。