2013-02-06 37 views
1

在AS3/Flex中,似乎沒有任何開箱即可阻止客戶端應用程序鏈接(外部或「靜態」)我的SWC的兩個版本。從歷史上看,發生這種情況時,它沒有發生任何編譯器警告,直到我們觀察到最終SWF中出現異常「混合」行爲,我們才知道出現了問題。有什麼我可以做的,以嚴格防止我的圖書館的兩個版本被包含在應用程序中?如何防止客戶端應用程序鏈接兩個不同版本的庫?

+0

我對AS3/Flex不是很熟悉,但是沒有一個屬性可以擴展和跟蹤對應用程序的實例/引用嗎?我已經在C#中使用Singleton實現來禁止一個類被多次實例化,並且如果嘗試這樣做了類實例駐留的內存地址,將返回:) – mayotic

+0

它必定是Flash VM的某些症狀在Flex編譯器中,但我發現即使靜態常量(或AS3意義上的類定義)被覆蓋也會被默認覆蓋。 –

+0

我不認爲有什麼辦法可以做到這一點;但有一個優先順序;因此無論哪個SWC文件被「包含」在最後是我相信使用的那個。除非版本之間有API更改;我不知道爲什麼會有編譯器錯誤。我會嘗試通過建立用於更新構建中的SWC的公約/程序來解決這個問題。@netSkay我很確定他在編譯時正在討論'鏈接';所以這不涉及跟蹤實例。 – JeffryHouser

回答

1

有兩種不同的連接方式:

  • 靜態鏈接(當程序的所有代碼在編譯時是已知的編譯器)。
  • 動態鏈接(當代碼加載到已編譯的應用程序中時,但它不一定是通過加載它的應用程序編譯的)。

    1. 你可能不必擔心,連接兩個不同版本的同一代碼很可能會失敗,除非該代碼被鏈接爲數據(如嵌入式SWF而不是真正的代碼),其中案件,誰這樣做可能會知道他們在做什麼。

    2. 如果加載不同版本的庫,則可能會發生幾種不同的情況。在矩陣的一邊有:「加載到不同的安全域」,「加載到子安全域」,「加載到相同的安全域」,在矩陣的另一側:「較新版本加載舊版本」,「舊版本載入較新版本「。

現在,加載到不同的安全域的每一種情況下可以加載不同版本的庫,還有什麼可以做這件事:那就是安全域是。當加載到相同的域時,第一個加載的代碼獲勝。加載到子域時,兩個域中將同時有兩個版本。

我會怎麼做:

class Version { 

private static var version:String; 

public static function setVersion():void { 
    if (version) trace("Another library was loaded"); 
    else version = "1.0.0"; 
}} 
import Version; 
Version.setVersion(); 

類定義之外的代碼將盡快SWF加載運行。如果此類已在之前加載,則將設置version變量。顯然,您可以使用更復雜的方法來確定要做什麼以及是否可以繼續前進,具體取決於版本是什麼。一般來說,你的代碼應該在「加載到子域」的情況下支持多個版本,如果不是,或者試圖以某種方式規避它,它將被認爲是一個錯誤。

+0

謝謝你的詳細解答。只要我回到我的開發環境,我會給這個鏡頭! –

相關問題