我有两个 SWF,分别称为 A 和 B。它们永远不会部署到网站上,而是用于工具。B 依赖于 A - B 中的某些类扩展了 A 中的类。
我现在正在创建第三个 SWF,称之为 X。X 正在尝试使用 a 和 加载 Aflash.display.Loader
和flash.net.URLRequest
B。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.exe
Flex 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 中的类?