c# - MonoGame 应用程序说缺少 SDL.dll,即使它存在。为什么?

标签 c# sdl monogame

我有一个使用 Visual Studio 中的 Linux 游戏模板构建的 MonoGame 应用程序。它在使用 .NET 或 Mono 的 Windows 上运行,但在 Linux 上失败。

错误是关于 SDL.dll 的 DllNotFoundException,但 SDL.dll 始终位于二进制目录中。该文件不是 CLR 程序集,因此它不在引用中。相反,我在构建期间从 MonoGame 的 Assemblies/Linux 目录复制了它(所有相关的 CLR 程序集也从该文件夹复制)。无论我是在 Windows 下的 Visual Studio 或 Xamarin Studio 中还是在 Linux 下的 MonoDevelop 中构建项目,都会出现该错误。没有构建错误。

这是相关的堆栈跟踪:

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 header ”并忽略它。这可能是意料之中的,因为它看起来像 Win32 二进制文件(而不是 CLR 程序集)。

最佳答案

上下文:

事实上,SDL.dll(来自 Assemblies/Linux)是一个 Win32 二进制文件。它包含在“MonoGame for Linux”模板中的原因是游戏也可以在 Windows 下运行。在 Linux 下,DLL 没有被触及。相反,Mono 搜索 SDL 库的 native Linux 版本。然而,出于某种原因,它无法映射。

解决方案:

  1. 确保您的 Linux 系统上安装了 libSDL 库。
  2. 转到您的项目并添加一个名为 Tao.Sdl.dll.config 的文件。这是因为我们要为 Tao.Sdl.dll 程序集编写应用程序配置文件(因为对 SDL 的调用发生在 Tao.Sdl.dll 内部)。
  3. 确保这个新文件的构建操作是 Content 并且它被复制到输出目录。
  4. 在新文件中写入以下内容(适用于 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>
    
  5. 清理和构建。

现在 Mono 应该有足够的信息来在您的系统上找到 libSDL。

关于c# - MonoGame 应用程序说缺少 SDL.dll,即使它存在。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25171606/

相关文章:

c# - 为什么 EF6 不支持 ` ignore ` 实体属性(复杂属性)Fluent API 的属性?

C# Lucene 获取所有索引

windows - 如何在 Visual Studio 2019 社区版中打开新的 MonoGame 桌面项目?

c# - 让 Monogame 内容管道与 Windows 8 中的 Visual Studio 2013 一起工作

c++ - 关于 SDL_Window 和 unique_ptr 的几个问题

c# - 在多个平台上使用.NET DLL

c# - 是否建议使用 ECB 密码模式?

c# - 一种自取消和重启任务的模式

c++ - SDL 独立于窗口更改视口(viewport)的渲染大小

go-sdl2 第一次运行后不清除窗口表面