2013-02-13 32 views
1

我有兩個SWF,稱它們爲A和B.它們將永遠不會部署到網站,並且正在用於工具。 B依賴於A - B中的某些類擴展A中的類。加載多個本地SWF時AS3錯誤1014

我正在創建第3個SWF,稱其爲X.X正試圖使用​​flash.display.Loaderflash.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中的類?

+0

在加載loaderB之前,您是否確保loa​​derA完全加載? – Marcela 2013-02-13 21:48:23

+0

@Marcela很確定,是的。更新了代碼片段,以顯示我如何等待完整事件。 – 2013-02-14 14:08:56

回答

1

有三種意見:

  1. 你是對的,當你指定的applicationDomainApplicationDomain.currentDomain;沒有這個加載器加載的SWF子域與公共父分開,所以他們不看對方的類。
  2. 對於常見的應用程序域,來自A的類必須可以從B訪問,所以我看到只有一種可能性出現錯誤:真的沒有類some.class.in.A。試着檢查這個類是否包含在A中(例如通過Sothink SWF Decompiler)或者只是檢查這個類是否明確地用在了A中的代碼中。如果它沒有被使用,那麼它不包括在內,你可以強制包含這個類通過在代碼中加入它:只需在new聲明中添加some.class.in.A一些在哪裏。
  3. context.securityDomain僅用於通過http加載swf文件並且不適用於本地時的其他用途。
+0

對於#2,我相當確信這個類實際上是在A中。原因是因爲我在Scaleform應用程序中以相同順序加載這些相同的SWF,並且一切正常。有問題的班級幾乎到處都是非常普遍的班級。 – 2013-02-14 14:28:59

+0

如果是這樣,你必須提供這些swf文件,我會在演示中檢查它們。順便說一句,你的意思是_mxmlc.exe_而不是_compc.exe_作爲最後一個編譯swc庫。 – fsbmain 2013-02-14 14:46:58

+0

我會嘗試在某個時候獲得更小的測試用例。儘管如此,我確實意味着compc - 我在關於管道如何工作的問題中增加了更多細節。 – 2013-02-14 15:23:55