1

我有两个 SWF,分别称为 A 和 B。它们永远不会部署到网站上,而是用于工具。B 依赖于 A - B 中的某些类扩展了 A 中的类。

我现在正在创建第三个 SWF,称之为 X。X 正在尝试使用 a 和 加载 Aflash.display.Loaderflash.net.URLRequestB。A 和 B 路径被推入一个数组,然后在一个loadLibrary函数中调用,如下所示:

public class LibraryLoader
{
    private static const CLASS_NAME:String = "LibraryLoader";
    private var _libraries:DisplayObjectContainer;

    ...

    public function loadLibrary(callback:Function, libName:String):void
    {
        trace("loadLibrary('" + libName + "')");

        var loader:Loader = new Loader();
        loader.name = libName;

        var listener:Function = function(e:Event):void
        {
            trace("finished loading '" + libName + "', event: " + e);
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, listener);
            _libraries.addChild(loader);
            callback();
        }

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, listener);
        loader.load(new URLRequest(libName));
    }

问题是,当我加载 B 时,它会引发错误。这是输出:

loadLibrary('C:\path\to\A.swf')
finished loading 'C:\path\to\A.swf', event: [Event type="complete" bubbles=false cancelable=false eventPhase=2]
loadLibrary('C:\path\to\B.swf')
[Fault] exception, information=VerifyError: Error #1014: Class a.class.in::A could not be found.

这个类在A里面,B依赖它。

我用谷歌搜索并找到了有关安全权限和沙箱的信息——也许我需要在这些 SWF 之间建立一些信任。这很好,但我似乎无法弄清楚如何正确地做到这一点。

一方面,我尝试像这样设置 LoaderContext(加载两个 SWF 时):

var context:LoaderContext = new LoaderContext();
context.applicationDomain=ApplicationDomain.currentDomain;
loader.load(new URLRequest(libName), context);

没有骰子,那里;同样的错误。此外,尝试设置context.securityDomain抛出:

[Fault] exception, information=SecurityError: Error #2142: Security sandbox violation: local SWF files cannot use the LoaderContext.securityDomain property. file:///C|/path/to/X.swf was attempting to load file:///C:/path/to/A.swf.

万一有所不同,A 和 B 正在使用compc.exeFlex SDK (3.6) 进行编译。我为每个生成一个 SWF 和一个 SWC - 用于运行时的 SWF 和用于编译的 SWC - 使用 compc。这是 compc 的命令行:

compc.exe  -output C:\temp\dir -source-path   -include-sources C:\path\to\A\source -directory=true -incremental=true -debug=true  -use-network=false 
compc.exe  -output C:\path\to\A.swc -source-path   -include-sources C:\path\to\A\source -incremental=true -debug=true  -use-network=false 
compc.exe  -output C:\temp\dir -source-path   -include-sources C:\path\to\B\source -directory=true -incremental=true -debug=true  -external-library-path+=C:\path\to\A.swc -use-network=false 

在第一次和第三次编译之后,一个“library.swf”文件被放到列出的临时目录中。我取出这些 SWF 并将它们重命名为 A.swf 和 B.swf,将它们放到我想要的位置。

我的 X 项目是在用于 Flash Player 10.1 的 FlashDevelop 4.0.1 中构建的。

我知道它a.class.in::A包含在 SWF A 中。我在 Scaleform 运行时中加载这些 SWF 时没有任何问题,因此我确信 FlashPlayer 的处理方式存在某种问题。

当我从 X 加载 A 和 B 时,如何让 B 查看 A 中的类?

4

1 回答 1

1

有三个评论:

  1. 你是对的,当你在没有这个加载器的情况下指定applicationDomainto时ApplicationDomain.currentDomain;,加载 swf 以将子域与共同的父域分开,因此它们看不到彼此的类。
  2. 对于通用应用程序域,必须可以从 B 访问来自 A 的类,所以我只看到错误的一种可能性: A 真的没有 class some.class.in.A。尝试检查该类是否包含在 A 中(例如由 Sothink SWF Decompiler)或仅检查该类是否在 A 中的代码中显式使用。如果未使用,则不包含在内,您可以强制包含通过在代码中添加这个类:只需some.class.in.A在 A withoutnew语句中添加一些 where 即可。
  3. context.securityDomain用于其他用途,仅在http加载swf文件时使用,不适用于本地。
于 2013-02-14T08:43:20.300 回答