我有兩個SWF,稱它們爲A和B.它們將永遠不會部署到網站,並且正在用於工具。 B依賴於A - B中的某些類擴展A中的類。加載多個本地SWF時AS3錯誤1014
我正在創建第3個SWF,稱其爲X.X正試圖使用flash.display.Loader
和flash.net.URLRequest
加載A和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像這樣(裝在兩個主權財富基金):
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生成一個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中。我在沒有問題的情況下將這些SWF加載到Scaleform運行時中,因此我確信在FlashPlayer的工作方式上存在某種問題。
當我從X載入A和B時,如何讓B看到A中的類?
在加載loaderB之前,您是否確保loaderA完全加載? – Marcela 2013-02-13 21:48:23
@Marcela很確定,是的。更新了代碼片段,以顯示我如何等待完整事件。 – 2013-02-14 14:08:56