首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ApplicationDomain:错误#1034:实例化类时强制类型失败

ApplicationDomain:错误#1034:实例化类时强制类型失败
EN

Stack Overflow用户
提问于 2015-02-24 03:17:56
回答 1查看 192关注 0票数 1

我做了一个简单的项目来重现这个问题。代码在描述的底部。

情景:我的应用程序从网络加载一个swf文件。swf包含两个简单的按钮类- ClassA、ClassB和一个包含两个按钮的面板ClassC。

在加载swf之后,当我尝试使用applicationDomain.getDefinition("ClassC")实例化ClassC时,它正常工作。

接下来,我加载另一个swf文件,其中包含名为mvFish的类。我尝试实例化它,它也可以工作。

接下来,我再次尝试实例化ClassC,它给出了错误:

[Fault] exception, information=TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::MovieClip@560ed61 to ClassA.

这个错误不是指我试图实例化的ClassC,而是指它内部的ClassA。

更新--更改ApplicationDomain无济于事--问题的详细信息:

所有的类定义仍然可用-我可以得到A、B、C或mvFish的定义。

A、B和mvFish仍然可以实例化(因为它们不包含子级)。

如果它的子类没有导出为类,C可以实例化。

如果将它们导出为类,则C会尝试实例化,但在创建其子对象(A和B)时会出现错误。看起来电影剪辑被截取并转换为ClassA,但失败了。如果我删除类A,那么错误就会发生在类B上。

如果我创建了任何类型的ApplicationDomain,在LoaderContext中使用它,然后尝试从它获取定义,它返回nullgetQualifiedDefinitionNames()给出空列表。只能通过加载器属性路径工作,因此加载器似乎有不同的域。

如果我再次加载第一个swf,问题就消失了。这就像每次我需要一个来自其他swf的类时,我需要重新加载它。

这是第一个swf库的样子,没什么复杂的:

以下是来自FlashDevelop项目的示例代码:

代码语言:javascript
复制
package {
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.system.LoaderContext;
    import flash.system.Security;
    import flash.system.SecurityDomain;
    import flash.system.ApplicationDomain;
    import flash.display.Sprite;

    public class Main extends Sprite {

        private var asset:Loader;
        private var lc:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            Security.allowInsecureDomain("*");
            Security.allowDomain("*");
            var l:Loader = new Loader();
            l.contentLoaderInfo.addEventListener(Event.COMPLETE, firstComplete);
            // loading first asset
            l.load(new URLRequest("http://zdg.ru/tmp/test_asset.swf"), lc);
        }

        private function firstComplete(evt:Event):void {
            asset = evt.target.loader;
            var mc:Class = asset.contentLoaderInfo.applicationDomain.getDefinition("ClassC") as Class;
            new mc() as Sprite; // trying to instantiate ClassC -- OK!
            var l:Loader = new Loader();
            l.contentLoaderInfo.addEventListener(Event.COMPLETE, secondComplete);
            // loading the second asset
            l.load(new URLRequest("http://zdg.ru/tmp/Fish.swf"), lc);
        }

        private function secondComplete(evt:Event):void {
            var mc:Class = evt.target.applicationDomain.getDefinition("mvFish") as Class;
            new mc() as Sprite; // trying to instantiate mvFish -- OK!
            mc = asset.contentLoaderInfo.applicationDomain.getDefinition("ClassC") as Class;
            new mc() as Sprite; // trying to instantiate ClassC again -- Error!
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-02-25 00:27:51

这不是一个真正的aswer,但是我昨天发布的代码没有工作,但今天它神奇地工作了。--更新--哦,忘了它吧,它不工作。

最后,我找到了原因。严格来说,它不能正常工作有两个原因:

1) ClassC中包含ClassA,它是一个SimpleButton。是的,只有按钮是坏的,并且只有那些包含在其他DisplayObjects中的按钮是坏的。将其设置为MovieClip,它就会正常工作。在没有容器的情况下直接实例化按钮,它也会工作。

2)项目在本地运行。把它放到主机上,它会像一个护身符一样工作,有按钮或其他任何东西。

那么最后一个问题:如何设置FlashDevelop以在本地使用加载的资源?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28681616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档