我试图在Monogame下运行Visual Studio中构建的项目。它成功构建,但是当我运行它时,我收到以下错误消息:
Unhandled Exception:
System.DllNotFoundException: SDL2.dll
at (wrapper managed-to-native) SDL2.SDL:SDL_SetMainReady ()
at Microsoft.Xna.Framework.SDL2_GameWindow..ctor () [0x00000] in <filename unknown>:0
at Microsoft.Xna.Framework.SDL2_GamePlatform..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
at MovingTeddyBears.Game1..ctor () [0x00000] in /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/Game1.cs:30
at MovingTeddyBears.Program.Main () [0x00001] in /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/Program.cs:19
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: SDL2.dll
at (wrapper managed-to-native) SDL2.SDL:SDL_SetMainReady ()
at Microsoft.Xna.Framework.SDL2_GameWindow..ctor () [0x00000] in <filename unknown>:0
at Microsoft.Xna.Framework.SDL2_GamePlatform..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
at MovingTeddyBears.Game1..ctor () [0x00000] in /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/Game1.cs:30
at MovingTeddyBears.Program.Main () [0x00001] in /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/Program.cs:19
The application was terminated by a signal: SIGHUP
以下是实际代码:
Game1.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace MovingTeddyBears
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
// teddy bears
TeddyBear bear0;
TeddyBear bear1;
TeddyBear bear2;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// set resolution to 800 by 600
graphics.PreferredBackBufferWidth = WINDOW_WIDTH;
graphics.PreferredBackBufferHeight = WINDOW_HEIGHT;
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// create teddy bears
bear0 = new TeddyBear(Content, "teddybear0", 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT);
bear1 = new TeddyBear(Content, "teddybear1", 200, 100, WINDOW_WIDTH, WINDOW_HEIGHT);
bear2 = new TeddyBear(Content, "teddybear2", 300, 100, WINDOW_WIDTH, WINDOW_HEIGHT);
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// update teddy bears
bear0.Update();
bear1.Update();
bear2.Update();
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// draw teddy bears
spriteBatch.Begin();
bear0.Draw(spriteBatch);
bear1.Draw(spriteBatch);
bear2.Draw(spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
}
}
的Program.cs:
#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
#endregion
namespace MovingTeddyBears
{
static class Program
{
private static Game1 game;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
game = new Game1();
game.Run();
}
}
}
TeddyBear.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
namespace MovingTeddyBears
{
/// <summary>
/// A class for a teddy bear
/// </summary>
class TeddyBear
{
#region Fields
// drawing support
Texture2D sprite;
Rectangle drawRectangle;
// velocity information
Vector2 velocity = new Vector2(0, 0);
// bouncing support
int windowWidth;
int windowHeight;
#endregion
#region Constructors
/// <summary>
/// Constructs a teddy bear with random direction and speed
/// </summary>
/// <param name="contentManager">the content manager for loading content</param>
/// <param name="spriteName">the name of the sprite for the teddy bear</param>
/// <param name="x">the x location of the center of the teddy bear</param>
/// <param name="y">the y location of the center of the teddy bear</param>
/// <param name="windowWidth">the window width</param>
/// <param name="windowHeight">the window height</param>
public TeddyBear(ContentManager contentManager, string spriteName, int x, int y,
int windowWidth, int windowHeight)
{
this.windowWidth = windowWidth;
this.windowHeight = windowHeight;
LoadContent(contentManager,spriteName, x, y);
// generate random velocity
Random rand = new Random();
int speed = rand.Next(5) + 3;
double angle = 2 * Math.PI * rand.NextDouble();
velocity.X = (float)Math.Cos(angle) * speed;
velocity.Y = -1 * (float)Math.Sin(angle) * speed;
}
/// <summary>
/// Constructs a teddy bear with the given characteristics
/// </summary>
/// <param name="contentManager">the content manager for loading content</param>
/// <param name="spriteName">the name of the sprite for the teddy bear</param>
/// <param name="x">the x location of the center of the teddy bear</param>
/// <param name="y">the y location of the center of the teddy bear</param>
/// <param name="velocity">the velocity vector for the teddy bear</param>
/// <param name="windowWidth">the window width</param>
/// <param name="windowHeight">the window height</param>
public TeddyBear(ContentManager contentManager, string spriteName, int x, int y,
Vector2 velocity, int windowWidth, int windowHeight)
{
this.windowWidth = windowWidth;
this.windowHeight = windowHeight;
LoadContent(contentManager, spriteName, x, y);
this.velocity = velocity;
}
#endregion
#region Public methods
/// <summary>
/// Updates the teddy bear's location, bouncing if necessary
/// </summary>
public void Update()
{
// move the teddy bear
drawRectangle.X += (int)(velocity.X);
drawRectangle.Y += (int)(velocity.Y);
// bounce as necessary
BounceTopBottom();
BounceLeftRight();
}
/// <summary>
/// Draws the teddy bear
/// </summary>
/// <param name="spriteBatch">the sprite batch to use</param>
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(sprite, drawRectangle, Color.White);
}
#endregion
#region Private methods
/// <summary>
/// Loads the content for the teddy bear
/// </summary>
/// <param name="contentManager">the content manager to use</param>
/// <param name="spriteName">the name of the sprite for the teddy bear</param>
/// <param name="x">the x location of the center of the teddy bear</param>
/// <param name="y">the y location of the center of the teddy bear</param>
private void LoadContent(ContentManager contentManager, string spriteName,
int x, int y)
{
// load content and set remainder of draw rectangle
sprite = contentManager.Load<Texture2D>(spriteName);
drawRectangle = new Rectangle(x - sprite.Width / 2,
y - sprite.Height / 2, sprite.Width,
sprite.Height);
}
/// <summary>
/// Bounces the teddy bear off the top and bottom window borders if necessary
/// </summary>
private void BounceTopBottom()
{
if (drawRectangle.Y < 0)
{
// bounce off top
drawRectangle.Y = 0;
velocity.Y *= -1;
}
else if ((drawRectangle.Y + drawRectangle.Height) > windowHeight)
{
// bounce off bottom
drawRectangle.Y = windowHeight - drawRectangle.Height;
velocity.Y *= -1;
}
}
/// <summary>
/// Bounces the teddy bear off the left and right window borders if necessary
/// </summary>
private void BounceLeftRight()
{
if (drawRectangle.X < 0)
{
// bounc off left
drawRectangle.X = 0;
velocity.X *= -1;
}
else if ((drawRectangle.X + drawRectangle.Width) > windowWidth)
{
// bounce off right
drawRectangle.X = windowWidth - drawRectangle.Width;
velocity.X *= -1;
}
}
#endregion
}
}
我找到了这个页面http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/,但这并没有解决问题。实际上,当我运行ldconfig -p |grep libgdiplus
时
我得到了
libgdiplus.so.0 (libc6,x86-64) => /usr/lib/libgdiplus.so.0
libgdiplus.so (libc6,x86-64) => /usr/lib/libgdiplus.so
所以.so文件似乎不是问题(我想,但不确定)。
答案 0 :(得分:0)
我不认为它是重复的,因为如果仔细查看错误消息,它们会有所不同。 Tao.Sdl.dll.config文件存在于/ bin / Debug文件夹中。正如我在http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/中所建议的那样
MONO_LOG_LEVEL=debug mono /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe
我得到了
Mono: Assembly Loader probing location: '/usr/lib/mono/4.5/mscorlib.dll'.
Mono: Image addref mscorlib[0x1620550] -> /usr/lib/mono/4.5/mscorlib.dll[0x161fad0]: 2
Mono: AOT module '/usr/lib/mono/4.5/mscorlib.dll.so' not found: /usr/lib/mono/4.5/mscorlib.dll.so: cannot open shared object file: No such file or directory
Mono: Assembly Loader loaded assembly from location: '/usr/lib/mono/4.5/mscorlib.dll'.
Mono: Config attempting to parse: '/usr/lib/mono/4.5/mscorlib.dll.config'.
Mono: Config attempting to parse: '/etc/mono/assemblies/mscorlib/mscorlib.config'.
Mono: GC_MAJOR: (mature allocation failure) pause 0.58ms, total 0.58ms, bridge 0.00ms major 384K/128K los 0K/0K
Mono: Assembly mscorlib[0x1620550] added to domain MovingTeddyBears.exe, ref_count=1
Mono: Config attempting to parse: '/etc/mono/config'.
Mono: Config attempting to parse: '/home/stefan/.mono/config'.
Mono: Assembly Loader probing location: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe'.
Mono: Image addref MovingTeddyBears[0x1689590] -> /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe[0x161e6c0]: 3
Mono: Assembly MovingTeddyBears[0x1689590] added to domain MovingTeddyBears.exe, ref_count=1
Mono: AOT module '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe.so' not found: /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe.so: cannot open shared object file: No such file or directory
Mono: Assembly Loader loaded assembly from location: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe'.
Mono: Config attempting to parse: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe.config'.
Mono: Config attempting to parse: '/etc/mono/assemblies/MovingTeddyBears/MovingTeddyBears.config'.
Mono: Assembly Loader probing location: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe'.
Mono: AOT module '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe.so' not found: /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe.so: cannot open shared object file: No such file or directory
Mono: Assembly Ref addref MovingTeddyBears[0x1689590] -> mscorlib[0x1620550]: 2
Mono: Assembly Loader probing location: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MonoGame.Framework.dll'.
Mono: Image addref MonoGame.Framework[0x168e8f0] -> /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MonoGame.Framework.dll[0x168da10]: 2
Mono: Assembly MonoGame.Framework[0x168e8f0] added to domain MovingTeddyBears.exe, ref_count=1
Mono: AOT module '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MonoGame.Framework.dll.so' not found: /home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MonoGame.Framework.dll.so: cannot open shared object file: No such file or directory
Mono: Assembly Loader loaded assembly from location: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MonoGame.Framework.dll'.
Mono: Config attempting to parse: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MonoGame.Framework.dll.config'.
Mono: Config attempting to parse: '/etc/mono/assemblies/MonoGame.Framework/MonoGame.Framework.config'.
Mono: Assembly Ref addref MovingTeddyBears[0x1689590] -> MonoGame.Framework[0x168e8f0]: 2
Mono: Assembly Ref addref MonoGame.Framework[0x168e8f0] -> mscorlib[0x1620550]: 3
Mono: Config attempting to parse: '/home/stefan/Downloads/LinuxMonoGameMovingTeddyBears/bin/Debug/MovingTeddyBears.exe.config'.
Mono: Assembly Loader probing location: '/usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll'.
Mono: Image addref System[0x169ea60] -> /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll[0x169db20]: 2
Mono: Assembly System[0x169ea60] added to domain MovingTeddyBears.exe, ref_count=1
Mono: AOT module '/usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll.so' not found: /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll.so: cannot open shared object file: No such file or directory
实际上,还有更多,但在这里发布时间太长了。另外,正如http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/中所建议的那样,我查看了/usr/local/lib/libgdiplus.so文件,该文件是libgdiplus.so.0.0.0的链接,但是当我尝试打开时它与gedit或vi一切都是乱七八糟的,即我看到的只是问号和奇怪的字符。有人可以帮帮我吗?