2009-10-28 119 views
4

我正在和我的朋友聊聊這件事,他相信你可以做到這一點,並說他已經做到了,但我無法讓它工作。AS3從外部SWF實例化類

我想知道它是否甚至可能。我嘗試在外部下載的SWF文件中輸入一個var作爲一個類,然後創建一個實例,但不能做。

一些代碼

private static function onCompleteHandler(e:Event) {
dashboardObject = e.target.content;
// registerClassAlias("Dashboard",); doesnt work
var dash:Class = getDefinitionByName("Dashboard") as Class;
var myDash = new dash();
trace(myDash.show);
}

錯誤

ReferenceError: Error #1065: Variable Dashboard is not defined.
at global/flash.utils::getDefinitionByName()
at System$/onCompleteHandler()

這麼看來,你不能讓一個類的實例,除非它是在項目SWF中遵守。如果這是真的,我希望它能做到。我不想讓人們試圖通過下載我在這裏構建的SWF文件來創建我的類的實例。

感謝

回答

0

這麼看來,你不能讓一個類的實例,除非它是在項目SWF中遵守。

嘗試ModuleLoader類。請參閱this關於如何創建模塊的文章。

+0

我只是想與人或很多樣,如果這是可能的或不確認的,因爲他們可以很容易使靜態類的一個實例,並改變瓦爾,你寧願讓他們不改變,如果它是一個API你的建築物,你需要某些var在你的API中被公開使用。這篇文章似乎是爲我目前不處理的flex。謝謝 – Chris

7

你需要做兩件事情:

  1. Dashboard包(package.to.Dashboard)。無包裝類與編譯包相比,具有編譯形式的不同屬性(受保護的名稱空間),使其無法訪問外部SWF。
  2. 確保您加載的SWF加載到相同的ApplicationDomain作爲父

然後,您應該能夠使用getDefinitionByName從加載的SWF和new返回Class

0

我建議使用CASALib這個。我創建了一個完整的應用程序,直到運行時才知道類名。我只是做了一些接口,以確保最重要的功能始終可用。稱爲LibraryManager的CASALIB實用程序具有用於從外部SWF實例化類的功能。

0

你可能想這樣做:

var dash:Class = Loader(e.target).contentLoaderInfo 
    .applicationDomain.getDefinition("Dashboard") as Class; 

getDefinitionByName()作品由當前SWF不是外部swf文件加載的類。對於外部swf,您需要給出實際加載特定swf的加載器對象的引用。另外,如果你在FlashBuilder中這樣做,請確保你正在加載的SWF中的「主應用程序」是Sprite(或者可能是一個MovieClip,雖然我沒有測試過),但是,而不是應用程序(就像您在爲新的SWF項目創建的默認MXML文件中一樣)。否則,上面的代碼將無法找到您要查找的類定義。

3
var loader:Loader = new Loader(); 
var req:URLRequest = new URLRequest("foo.swf"); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fooLoadComplete); 
loader.load(req); 


function fooLoadComplete(e:Event):void 
{ 
    var ClassDefinition:Class = e.target.applicationDomain.getDefinition("Symbol1") as Class; 
    var sym1:MovieClip = new ClassDefinition(); 

    this.addChild(sym1); 
} 
+0

像魅力一樣工作,除了我必須用movieclip擴展我的自定義類以便使用新發現的類定義來實例化「sym1」。沒什麼大不了的,因爲之後我仍然可以訪問它的所有擴展功能/特性。另外,我包含的swf是從flash dev創建的,爲了從這個swf獲取公共類,我不得不簡單地將類名稱放在'Main'中(不要留下主空),因此編譯器包含該類 – CenterOrbit

+0

謝謝。這很好。 –