Невозможно привести класс, реализующий интерфейс к этому интерфейсу в IronPython и C # - PullRequest
1 голос
/ 23 декабря 2009

Я пытаюсь написать скриптовый движок для моей игры на C # / XNA, используя IronPython, и столкнулся с проблемой.

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

В конструкторе Game1 я выполняю необходимую инициализацию скрипта, а затем запускаю его для создания объекта 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 в скрипт, все будет нормально.

RenderingStreamTesting и GFXEngine - это два проекта в одном решении, а RenderingStreamTesting является проектом базовой игры, на который ссылается GFXEngine.

Из того, что я обнаружил, проблема может быть вызвана ссылками на разные сборки. Я дважды проверил, и все ссылки сделаны на собственные .NET .dll и все сторонние библиотеки перечислены в общем каталоге.

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 24 декабря 2009

Вероятно, это вызов AddReferenceToFile. Скорее всего, вы получите одну и ту же сборку, загруженную в несколько контекстов загрузчика. Если XNA находится в GAC, я бы порекомендовал поместить GFXEngine в GAC или поместить его в тот же каталог, что и точка входа EXE, и использовать AddReference. Таким образом, все должно быть загружено в один и тот же контекст.

1 голос
/ 23 декабря 2009

Может ли сценарий IronPython скомпилироваться как IL "Any CPU" (возможно, если вы запускаете это на ОС x64)?

У меня возникли проблемы с этим, когда моя сборка приложения была настроена на платформу «Любой ЦП», а моя библиотека XNA нацелена на x86. Изменение платформы сборки приложения на x86 также решило проблему.

Я не уверен, однако, возможно ли управлять настройкой платформы в проекте IronPython.

...