【问题标题】:ApplicationDomain: Error #1034: Type Coercion failed when instantiating classApplicationDomain: 错误 #1034: 实例化类时类型强制失败
【发布时间】:2015-02-23 19:17:56
【问题描述】:

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

情况:我的应用从网络加载了一个 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 可以实例化。

如果它们作为类导出,C 会尝试实例化,但在创建其子项(A 和 B)时会出错。看起来像一个电影剪辑被拍摄并被投射到 ClassA 并且失败了。如果我删除 A 类,错误会发生在 B 类中。它会发生在任何子类中。

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

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

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

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

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!
        }
    }
}

【问题讨论】:

  • 如果这是您的问题,我不是 100%,但要加载具有新上下文的 swf,只需声明一个像这样的 var myContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(), null); 并将其用作 myLoader.load(myURLReq, myContext); 的参数我会链接官方 as3 参考,但对我来说似乎离线
  • 您是为自己制造这些问题的人。我猜你不使用(或从不使用)任何包,并且在不同的地方使用相同的类名。当然,您正在创建包允许您避免的冲突。
  • 不,给定的代码是唯一的代码。没有其他班级,没有不同的地方。你可以编译看看。
  • @MartonPallagi 不幸的是,第二次加载之前lc = new LoaderContext(true, new ApplicationDomain()); 没有帮助,错误是一样的。
  • 没有其他课程?所以你的意思是不涉及导出的库符号(lexported ibrary 符号当然是类)?这与您在问题中所说的相反。 getDefinition 仅适用于类,所以当你显然试图实例化 ClassC 等时,你怎么能说没有其他类...

标签: actionscript-3 flash


【解决方案1】:

这不是一个真正的答案,但我发布的代码昨天不起作用,但它今天神奇地起作用。 -- 更新 -- 哦忘了它,它不起作用。

终于找到了原因。它不能严格工作有两个原因:

1) ClassC 包含 ClassA,它是一个 SimpleButton。是的,只有按钮是坏的,只有那些包含在其他 DisplayObjects 中的按钮。把它做成一个MovieClip,它就可以工作了。不用容器直接实例化按钮,也可以。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2011-05-22
    • 2015-08-10
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多