2009-12-23 53 views
1

我正在嘗試使用IronPython向我的C#/ XNA遊戲編寫腳本引擎,並遇到了問題。無法在IronPython和C#中執行接口並實現此接口類#

public class Game1 : Game, IGFXEnabledGame 
{ 
    //stuff 
} 

Game1構造我做劇本必要的初始化,然後運行它來創建Camera對象。我嘗試下面的硬編碼的相機初始化移動到一個腳本:

CCamera camera = new CFPPCamera(this); 

CCamera是一個抽象類,並從中CFPPCamera inhertits。 CFPPCamera具有下面的構造:

public CFPPCamera(Game game) 
    : base(game) 
{ 
} 

腳本初始化:

InitScriptPath = "InitScript.py"; 
rootDir = AppDomain.CurrentDomain.BaseDirectory; 
scriptDir = Path.Combine(rootDir, "Scripts"); 
scriptEngine = Python.CreateEngine(); 
scriptRuntime = scriptEngine.Runtime; 
scriptScope = scriptRuntime.CreateScope(); 
scriptSource = scriptEngine.CreateScriptSourceFromFile(Path.Combine(scriptDir, InitScriptPath)); 
scriptScope.SetVariable("this", this); 
scriptSource.Execute(scriptScope); 

Script代碼

import clr 
clr.AddReference('Microsoft.Xna.Framework') 
clr.AddReference('Microsoft.Xna.Framework.Game') 
clr.AddReferenceToFile("../../../../../GFXEngine/bin/x86/Debug/GFXEngine.dll") 

import Microsoft.Xna.Framework 
from GFXEngine.GFX.Camera import * 
from GFXEngine.GFX import * 

camera = CFPPCamera(this); 

的代碼編譯沒有警告或錯誤,但在執行腳本我出現錯誤:

Unable to cast object of type 'RenderingStreamTesting.Game1' to type GFXEngine.GFX.IGFXEnabledGame'. '

如果我沒有將相機一代傳遞給腳本,一切工作正常。

RenderingStreamTestingGFXEngine是同一解決方案中的兩個項目,其中RenderingStreamTestingGFXEngine引用的基礎遊戲項目。

從我發現問題可能由引用不同的程序集引起的。我再次檢查並且所有引用都是針對本機.NET .dll,並且所有第三方庫都列在共同目錄中。

我錯過了什麼?

回答

1

可能IronPython腳本最終被編譯爲「任何CPU」IL(也許如果你在x64操作系統上運行這個腳本)?

我遇到過這樣的問題,我的應用程序集被設置爲目標「任何CPU」平臺,而我的XNA庫目標是x86。將應用程序部件上的平臺更改爲x86也解決了這個問題。

我不確定是否可以在IronPython項目中控制平臺設置。

+0

我已經被具有不同構建版本的不同項目燒燬。無論這是否解決了您的問題,我都無法確定。 XNA是一個強項,但我的IronPython體驗是有限的。 – Finglas 2009-12-23 14:49:49

3

這可能是AddReferenceToFile調用。最有可能的是,你最終會將相同的程序集加載到多個加載器上下文中。如果XNA位於GAC中,我會建議將GFXEngine放入GAC中,或將其放入與入口點EXE相同的目錄並使用AddReference。這樣一切都應該加載到相同的上下文。