我在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,并且他们都说未找到该文件。当我尝试&#34;帮助&#34;通过将文件重命名为libSDL.dll
(或其他任何其他寻找的东西)的运行时,它表示&#34;无效的ELF标题&#34;并忽略它。这可能是预期的,因为它看起来像Win32二进制文件(不是CLR程序集)。
答案 0 :(得分:4)
背景:
实际上,SDL.dll(来自Assemblies / Linux)是一个Win32二进制文件。它被包含在&#34; MonoGame for Linux&#34;模板是这样的,游戏也可以在Windows下运行。在Linux下,不会触及DLL。相反,Mono搜索SDL库的本机Linux版本。但是,出于某种原因,它无法映射。
<强>解决方案:强>
Tao.Sdl.dll.config
的文件。这是因为我们想为Tao.Sdl.dll
程序集编写应用程序配置文件(因为对SDL的调用是从Tao.Sdl.dll
内部发生的)。在新文件中写下以下内容(适用于libSDL 1.2 - 其他版本可能需要不同的名称):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<dllmap dll="SDL.dll" target="libSDL-1.2.so.0" />
<dllmap dll="SDL_image.dll" target="libSDL_image-1.2.so.0" />
<dllmap dll="SDL_mixer.dll" target="libSDL_mixer-1.2.so.0" />
<dllmap dll="SDL_ttf.dll" target="libSDL_ttf-2.0.so.0" />
<dllmap dll="SDL_net.dll" target="libSDL_net-1.2.so.0" />
<dllmap dll="smpeg.dll" target="libsmpeg-0.4.so.0" />
<dllmap dll="SDL_gfx.dll" target="libSDL_gfx.so.4" />
</configuration>
清理并构建。
现在,Mono应该有足够的信息在您的系统上找到libSDL。
答案 1 :(得分:1)
确实,您找到的解决方案可以解决您遇到的问题,但现在可以采用更简单的方法。