我有两个项目,A和B,它们引用一个库MyExternalLibrary。A和B是.swfs (两个不同的AS3项目),MyExternalLibrary是.swc。当我的应用程序运行时,A会加载B。
有一个Class,MyLoader,在MyExternalLibrary中,B广泛使用。MyExternalLibrary.MyLoader加载服务器上存在的.swf(我们不嵌入它们,因为它们是每个用户请求动态加载的)。
请注意,我们的服务器包含A、B和我们将要下载的所有.swf。
现在,A还必须在我们的服务器上加载一些.swf。因此,A也必须在MyExternalLibrary中使用MyLoader。因此,在A中,我添加了对MyLoader的引用,以便在编译过程中包含它的二进制文件。我只添加一个对MyLoader的引用--我实际上并不实例化或修改它。也就是说,在A的代码中(在加载B之前),我有:
MyLoader;
我(显然)也导入了Class。这确保了MyLoader的二进制文件将包含在A的.swf中。
仅仅在A中引用A就破坏了B的MyLoader功能--尽管它是一个MovieClip,并且拥有所有正确的字段,但B加载的所有.swf都不会cast到其关联的Class。此外,在调试器中,加载的MovieClip表明它们是正确的Class。例如,如果我加载一个.swf,它将是一个MovieClip;此外,调试器声明它是B.mySwfs.MyClass类型,但我不能将它cast到B.mySwfs.MyClass。我相信罪魁祸首是ApplicationDomain。
请注意,注释掉这一行代码可以使B cast中的所有内容都正常运行。
如果有人知道这是怎么回事,我想听听一些建议。我认为这个问题与ApplicationDomain有关,因为A拥有MyExternalLibrary.MyLoader,我正在尝试将由A加载的MovieClip放到B中的Class中。当我注释掉A中所有对A的引用时,B现在拥有了MyExternalLibrary.MyLoader,因此它可以转换为B中的类。这就是我的预感!
谢谢,
发布于 2012-07-24 18:08:07
解决方案是确保B的ApplicationDomain与A的ApplicationDomain相同,这是通过在Loader.load或Loader.loadBytes中参数化LoaderContext实例来实现的。
例如,A用以下代码行加载B:
m_loader.load(new URLRequest("B.swf"), new LoaderContext(false, ApplicationDomain.currentDomain));
这将B的所有Class定义都添加到A中。因此,当A加载.swf时,MovieClip被cast编辑为Class in B,因为A和B位于相同的ApplicationDomain中。因此,d22由A加载到cast可以被编辑到d25中的d26。
如果其他人遇到这个问题,我强烈建议大家看看GreenSock的SWFLoader:http://www.greensock.com/as/docs/tween/com/greensock/loading/SWFLoader.html
https://stackoverflow.com/questions/11615843
复制相似问题