|
|
|||||
ApplicationDomain и интерфейсы
Всем привет
Суть ситуации вот в чем: - Есть swf-контейнер для нескольких игр - Есть несколько swf-файлов, в которых зашиты несколько вариантов логики игры (класс Game, называется так во всех swf-ках). - Далее, есть интерфейс IGame, который зашит во все swf-ки, включая контейнер. Идея такая, что swf-загрузчик обращается к логике любой игры через IGame. Но... Так как имена классов совпадают (логика везде называется Game), то во избежание повторения имен классов, я каждый раз swf с классом Game гружу в новый ApplicationDomain. И вот в чем весь косяк - интерфейс IGame в загружаемой swf-ке тоже попадает в новый ApplicationDomain, а значит, он уже не равен интерфейсу в swf-ке загрузчике. Соответственно, кастинг Game из загруженной swf-ки в IGame загружающей возвращает ровно null =( Уфф... ну вот, наконец-то, и сам вопрос - как лучше с этим разобраться, при учете, что необходимо сохранить имя класса Game во всех swf-ках? UPD: Судя по всему, нужного эффекта никак не добиться. По сути, мне нужно было перезаписать класс Game в текущем домене приложения, чего сделать никак нельзя. Единственный выход для сохранения строгой типизации - это изменение имен классов в загружаемых swf-ках и загрузка этих swf-ок в ApplicationDomain.currentDomain
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 08.09.2010 в 12:01. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Значит игра плохо выгружается, если остается Game в домене.
|
|
|||||
А как лучше выгрузить?
Тупо unload? Просто у меня была мысль завести отдельный домен и каждый раз грузить в него. Чтобы обращаться не loader.contentLoaderInfo.applicationDomain, а просто myCustomDomain. Но почему-то через loader дефинишн есть, а через customDomain - нет =) Может я чего-то не так понял из доков
__________________
...вселенская грусть |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Домен должен быть дочерним к текущему, хотя бы.
unload да, и все ссылки поубивать. |
|
|||||
Цитата:
Только как быть с доменом? Я гружу в кастомный домен, который дочерний к текущему домену приложения. Затем тем же лоадером гружу в еще один домен, который тоже дочерний к текущему. По окончании загрузки всего - loader.unload После этого, мне по идее, нужно только убить ссылки на домены (создать новые домены по тем же ссылкам) и на экземпляры классов из доменов. После этого можно грузить заново классы с такими же именами?
__________________
...вселенская грусть |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Надо грузить всегда в один и тот же домен (дочерний), не пересоздавая. Ссылок на классы из домена при выгрузке быть не должно. В консоли как минимум должен появится [Unload SWF], если всё прошло удачно.
|
|
|||||
Ага, то есть получается, что swf-ка намертво привязана к loader'у
Я полагал, что она лежит в домене, а loader просто имеет на нее ссылку Спасибо, вроде разобрался.
__________________
...вселенская грусть |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Лоадер можно пересоздавать, а домен постоянный. Это не принципиально, можно все пересоздавать.
|
|
|||||
var domain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); var loader:Loader = new Loader(); var context:LoaderContext = new LoaderContext(true, domain); // грузим... loader.contentLoaderInfo.applicationDomain.hasDefinition("Game") // выводит true domain.hasDefinition("Game") // выводит false И почему оно не кастуется в интерфейс зашитый в оба файла?
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 08.09.2010 в 14:54. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Меня первая строчка смущает.
|
Часовой пояс GMT +4, время: 18:01. |
|
« Предыдущая тема | Следующая тема » |
Теги |
applicationDomain , interface , loader as3 |
|
|