如何在64位环境中编译和运行Physics2D.NET演示

时间:2011-07-24 15:47:37

标签: c# 2d physics

在询问我的问题的过程中,我已经找到了我需要的答案,但我也有兴趣分享我所学到的知识,看到人们在尝试进入2D物理学时可能会有任何其他评论。

我想在C#中使用2D物理引擎。我已经下载了Box2dx和Physics2D.Net。 Box2dx的演示很好,但我关注性能和编码复杂性。所以我决定尝试一下Physics2D.Net(我找不到太多的信息来比较Box2dx和Physics2d.Net,但我有理由相信Physics2D.Net基于我读过的内容更容易编码,而且我怀疑它可能表现更好)。不幸的是,该演示将无法运行。尝试在Windows 7 64位上运行Physics2DDemo示例程序时,我得到了BadImageFormat异常。

就像我说的那样,我已经想出如何让演示运行,所以我希望你不介意我发布并接受我自己的答案,但是任何其他与这个主题相关的有用评论我仍然会投票,如果有人有更好的答案(比如“尝试其他更好的下载”),我仍然可以自己选择。

3 个答案:

答案 0 :(得分:1)

下载SdlDotNet的源代码以调试加载字体时发生的BadImageformatException的源代码后,我发现在尝试初始化字体系统时发生了这种情况。我猜测为什么会发生这种情况的原因是仍然有一些32位DLL在那里运行,并且所有.NET程序集都在64位进程中运行。所以我强迫最高级别的.NET程序集以x86而不是任何CPU为目标。为了从Visual C#2010 Express执行此操作,我打开了Build菜单,选择了“Configuration Manager”,选择“x86”作为Active Solution Platform,并对3个项目进行了一些更改

  • Physics2DDemo
  • Physics2DDotNet
  • Physics2DDotNet.Demo

(我可能不需要改变所有这些,但是只更改Physics2DDemo似乎不起作用。可能是因为我需要重新打开解决方案和/或更强有力地重建,但它最终工作。)这些是我对每个项目所做的更改:

  1. 在平台列中,选择“< New ...>”
  2. 在弹出的对话框中,选择x86作为新平台,然后选择“Any CPU”作为要复制的源。
  3. 选中“构建”框。
  4. 关闭Configuration Manager窗口并打开此单个项目的“项目设置”。
  5. 在“构建”选项卡上,从输出路径中删除“x86”,只留下bin \ Debug。
  6. 回想起来,我想我应该检查每个项目的“Build”框,这可以减少我在使项目DLL版本保持彼此同步方面的一些问题。

    这确实让我超越了字体问题,但只有几行代码。接下来,在为SurfaceGl执行类型初始化程序时失败了。它失败了:

    static glLoadIndentityDelegate glLoadIdentity = 
    (glLoadIndentityDelegate)Marshal.GetDelegateForFunctionPointer(
    Sdl.SDL_GL_GetProcAddress("glLoadIdentity"), typeof(glLoadIndentityDelegate));
    

    显然SDL_GL_GetProcAddress返回0.事实证明,我为SdlDotNet下载的代码比使用Physics2D.Net提供的代码稍微高一些,但却没有使用Physics2D.Net。我用原始的DLL替换了更新的DLL,现在我能够编译并运行Physics2D.NET演示了!

    当然,任何想要将Physics2D.NET整合到纯.NET引擎中的人,或者可以容纳64位进程的人都可能想要构建“AnyCPU”解决方案目标而不是x86目标。并且可能值得将x86解决方案目标中的所有项目切换为x86构建。

    我注意到我现在可以切换项目目标,以便Physics2DDemo是唯一一个构建为x86的项目。作为DLL的其余程序集将加载到该进程中,就像进程选择的那样。因此,强制该程序集启动32位进程就足够了。

    我可能会在这里忽略一些步骤。我确实重新加载了解决方案并强制重建多次,以便Visual Studio与新的目标位置和版本等重新同步。但我认为这一切都是因为我切换了SdlDotNet版本。所以我希望所有这些都不是必需的。

答案 1 :(得分:0)

如果您在上述更改后收到“找不到文件”,

您可能还需要添加.. |到dataDir的开头,所以它变成

static readonly string dataDir =
  @"..|..|..|..|data".Replace('|',Path.DirectorySeparatorChar);

在VS2010中,当你摆弄平台和目标时,你会获得额外的目录层......

答案 2 :(得分:0)

我知道它已经过时了,但我在Google上搜索解决方案时遇到了同样的问题,我来到这里,但意识到它比你的解决方案更简单。 我通过写作实现了它:

        string dataDir = "C:\\Windows\\Fonts\\arial.ttf";
        font = new Font(dataDir, 40);
        font.Bold = true;
        font2 = new Font(dataDir, 15);

在“Demo.cs”上的第97 - 100行。为我工作。