从运行时加载的swf实例化类时出错

时间:2011-03-21 14:14:13

标签: actionscript-3 class flash external

我有以下内容:

        protected function caller(event:FlexEvent):void
        {
            var r:URLRequest=new URLRequest('http://remote/TESTLibrary.swf');
            var c:LoaderContext=new LoaderContext();
            c.applicationDomain=ApplicationDomain.currentDomain;
            var l:Loader=new Loader();
            l.contentLoaderInfo.addEventListener(Event.COMPLETE, hndComplete);
            l.load(r, c);
        }


        protected function hndComplete(event:Event):void
        {
            var d:ArrayCollection; //not used but here for
            var cls:Class=(event.target as LoaderInfo).applicationDomain.getDefinition('ro.vnc.modules.ModuleManager') as Class;
            var instance:Object=new cls();
        }

包含在库中的类:

package ro.vnc.modules
{
    import mx.collections.ArrayCollection;

    public class ModuleManager
    {
        public function ModuleManager()
        {
            var d:ArrayCollection;//if commented works fine
            var c:Number=5;
            trace('ModuleManager', c);
        }
    }
}

如果我评论d的定义:ArrayCollection eveything工作正常,但我使用全局可访问包中的类,如mx.collections,我得到一个VerifyError:错误#1014:找不到类mx.collections :: ArrayCollection。任何帮助都应该非常感谢。

2 个答案:

答案 0 :(得分:1)

这种情况下的类型是导入的,因为你可以看到你是否更加关注旧的加载器。但是我写了另一种加载swf的方法,它非常有效:

    public function ModulesInstaller()
    {
        var f:File=new File();

        f.addEventListener(Event.SELECT, hndSelect);
        f.browseForOpen('Select Library', [new FileFilter('Library file', '*.swf')]);
    }


    protected function hndSelect(event:Event):void
    {
        var fs:FileStream=new FileStream();
        fs.open(event.target as File, FileMode.READ);
        var bytes:ByteArray=new ByteArray();
        fs.readBytes(bytes);
        var lc:LoaderContext=new LoaderContext();
        lc.allowCodeImport=true;
        var l:Loader=new Loader();
        l.contentLoaderInfo.addEventListener(Event.INIT, hndLoaded);
        l.loadBytes(bytes, lc);
        l.loaderInfo

    }

    private function hndLoaded(event:Event):void
    {
            var clsRef:Class=(event.target as LoaderInfo).applicationDomain.getDefinition('classRefName') as Class;
    }

答案 1 :(得分:0)

问题是您正在引用ArrayCollection而不先在调用者中导入它。我确切地知道你要做什么 - 在运行时将该类用于标准用法,但是flash不允许这样做。如果没有明确引用类flash,就不得不猜测“ArrayCollection”是什么 - 所以它在编译时抛出了验证错误。我尝试了几个不同的类类型=和它的标准行为。

注意 - 如果您在被调用者中实例化该类 - 您可以在调用者中获得对正确类型对象的引用:

package ro.vnc.modules
{
    import mx.collections.ArrayCollection;

    public class ModuleManager
    {

        public var d:ArrayCollection;

        public function ModuleManager()
        {
            d = new ArrayCollection();
            var c:Number=5;
            trace('ModuleManager', c);
        }
    }
}

但是只要在调用者中将其作为类型引用,就会出现验证错误。

 protected function hndComplete(event:Event):void
            {
                var cls:Class=(event.target as LoaderInfo).applicationDomain.getDefinition('ro.vnc.modules.ModuleManager') as Class;
                var instance:Object=new cls();
                trace(instance.d); //[object ArrayCollection]
                var d1:ArrayCollection = instance.d; // throws verify error
                var d2:* = (event.target as LoaderInfo).applicationDomain.getDefinition(instance.d); // throws reference error
            }

解决方案是在调用类中导入类型。 (虽然我很乐意看到有人为这个场景提出了一个没有额外导入功能的解决方案......)

喝彩!