3

Je rencontre un problème en essayant de charger des classes définies en externe dans actionscript 3.0. Je crois que cela est un problème avec ma compréhension des classes ApplicationDomain/LoaderContext, mais même après avoir parcouru la documentation et quelques recherches sur le Web, je suis toujours coincé. Essentiellement ce que je veux faire est charger un swf qui contient un symbole qui est une implémentation d'une interface partagée entre le swf appelant et le swf chargé. Je peux charger le swf très bien et instancier et exécuter les méthodes dessus très bien, mais seulement tant que je ne tente pas de le convertir en type interface partagée. Si je tente de le convertir, j'obtiens un TypeError: Erreur # 1034: La coercition de type a échoué: erreur de type.Actionscript 3 chargement du problème de moulage externe de swf

Je me suis douté que c'est parce que quand je charge la nouvelle classe flash le reconnaît comme une classe complètement différente, d'où l'exception. Le documentation suggère l'utilisation d'un argument LoaderContext, avec applicationDomain défini sur ApplicationDomain.currentDomain.

Le problème est que cela n'a aucun effet. Indépendamment du fait que j'applique ApplicationDomain à currentDomain, null ou à un enfant du domaine en cours, une erreur de coercition de type échoue toujours. La partie :: de l'erreur semble indiquer que la classe que j'ai chargée est dans un espace de noms différent ou un tel, quand je veux qu'il soit dans le même espace de noms que mon chargeur.

code:

import flash.display.Loader; 
import flash.display.MovieClip; 
import flash.events.Event; 
import flash.net.URLRequest; 
import flash.system.ApplicationDomain; 
import flash.system.LoaderContext; 

public class TestSkin extends MovieClip 
{ 
    var mLoader:Loader; 

    public function TestSkin() 
    { 
     super(); 
     startLoad("ExternalTest.swf"); 
    } 

    private function startLoad(url:String):void 
    { 
     mLoader = new Loader(); 
     var mRequest:URLRequest = new URLRequest(url); 
     var appDomain:ApplicationDomain = ApplicationDomain.currentDomain; 
        //Loading into different domains seems to have no effect 
     //var appDomain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 
     //var appDomain:ApplicationDomain = null; 
     mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
     mLoader.load(mRequest, new LoaderContext(false, appDomain)); 
    } 

    private function onCompleteHandler(loadEvent:Event):void 
    { 
     //Get the object from the loadEvent 
     var obj:Object = loadEvent.target.content; 
     //Verify that the methods exist on the object 
     trace("Loaded item id: " + obj.getInterfaceId()); 
        //This returns Loaded item id: ExternalTestInterfaceImplementation! 
     //Try assigning as an instance of the shared type - fails with type coercion error 
        //Throws the following type error: 
        //TypeError: Error #1034: Type Coercion failed: cannot convert myPackage::ExternalTestInte[email protected] to myPackage.TestInterface. 
     var castItem:TestInterface = TestInterface(obj); 
     trace("castItem: " + castItem); 
    } 
} 

déclaration Interface:

public interface TestInterface 
{ 
    function getInterfaceId():String; 
} 

mise en œuvre Interface

public class ExternalTestInterfaceImplementation extends MovieClip implements TestInterface 
{ 
    public function getInterfaceId() : String 
    { 
     return "ExternalTestInterfaceImplementation!"; 
    } 

    public override function toString():String 
    { 
     return getInterfaceId();  
    } 
} 
+0

Pouvez-vous coller le message d'erreur exact? –

+0

Bien sûr. J'ai omis le numéro de ligne en raison des importations et autres, mais je peux dire avec certitude que l'erreur est lancée sur la ligne var castItem: TestInterface = TestInterface (obj); TypeError: Erreur # 1034: Type Coercion a échoué: ne peut pas convertir myPackage :: ExternalTestInterfaceImplementation @ 29b4e6a1 à myPackage.TestInterface. – user432437

Répondre

1

Il semble que cela est causé par un bogue dans le lecteur. J'ai rencontré ce même problème il y a un moment. Il est décrit ici:

https://bugs.adobe.com/jira/browse/ASC-3529

Il y a une solution, qui consiste essentiellement à charger le swf avec un URLLoader (en binaire), puis en utilisant Loader::loadBytes (au lieu d'utiliser un Loader régulier).

Voici un explantion de cette solution de contournement et une classe de chargeur qui résout ce problème:

http://blog.aleksandarandreev.com/?p=42

+0

Merci qui ressemble à un bon endroit pour commencer. – user432437

+0

Cela a définitivement réglé le problème, merci. Il semble étrange que cela fait un an que le bug a été signalé et qu'il n'a toujours pas été corrigé. Je me demande si c'est une bizarrerie qui n'a pas été communiquée sur les contextes de sécurité ou quelque chose, ou un véritable bug. – user432437

Questions connexes