2009-12-23 36 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。这样一切都应该加载到相同的上下文。