在下載SdlDotNet的源代碼以調試到加載字體時發生的BadImageformatException的源代碼後,我發現它在嘗試初始化字體系統時發生。我爲什麼會發生這種情況的猜測是,在那裏仍然有一些32位的DLL在運行,所有.NET程序集都在64位進程中運行。所以我強制最高級別的.NET程序集來定位x86而不是Any CPU。從Visual C#2010速成做到這一點,我打開生成菜單,選擇「配置管理器」,選擇「86」作爲活動解決方案平臺,並做了一些改動,以3個項目
- Physics2DDemo
- Physics2DDotNet
- Physics2DDotNet.Demo
(我大概沒有需要改變所有這些,只是Physics2DDemo改變似乎並沒有工作。這可能是因爲我需要重新打開該解決方案和/或者更強有力地重建,但它最終奏效了。)這些都是變化ES我對每個項目做:
- 在平臺欄中,選擇「<新建... >」
- 在彈出的對話框中,選擇86作爲新平臺,並選擇「任何CPU」作爲從中複製的來源。
- 選中「Build」框。
- 關閉配置管理器窗口並打開這個單獨項目的項目設置。
- 在「構建」選項卡上,從輸出路徑中刪除「x86」,只留下bin \ Debug。
回想起來,我想我應該檢查每個項目上的「構建」框,這可能會減少我在使項目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版本。所以我希望所有這些都不是必須的。
而順便說一下,物理2D的性能看起來*顯着*更快。 – BlueMonkMN