无法在IronPython和C#中为此接口强制转换类实现和接口

时间:2009-12-23 12:02:36

标签: c# .net interface xna ironpython

我正在尝试使用IronPython为我的C#/ XNA游戏编写脚本引擎,并遇到了一个问题。

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

Game1构造函数中,我对脚本进行了必要的初始化,然后运行它来创建Camera对象。我尝试将以下硬编码的Camera初始化移动到脚本:

CCamera camera = new CFPPCamera(this);

CCamera是一个抽象类,CFPPCamera来自它。 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);

脚本代码

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'.'

如果我没有将Camera生成传递给脚本,一切正常。

RenderingStreamTestingGFXEngine是同一解决方案中的两个项目,RenderingStreamTestingGFXEngine引用的基础游戏项目。

从我发现的问题可能引用不同的程序集引起的。我仔细检查了所有引用都是针对本机.NET .dll的,并且所有第三方库都列在了公共目录中。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

可能是AddReferenceToFile调用。最有可能的是你最终将相同的程序集加载到多个加载器上下文中。如果XNA在GAC中,我建议将GFXEngine放入GAC或将其放在与入口点EXE相同的目录中并使用AddReference。这样一切都应该加载到相同的上下文中。

答案 1 :(得分:1)

可能IronPython脚本最终被编译为“任何CPU”IL(也许如果你在x64操作系统上运行它)?

我遇到过这样的问题,我的app组件设置为以“任何CPU”平台为目标,而我的XNA库以x86为目标。将app程序集上的平台更改为x86也解决了这个问题。

我不确定是否可以控制IronPython项目中的平台设置。