[英]Create Plugins in Flex - loading nested SWF files
我正在嘗試為我們的應用程序實現一個插件系統,讓自己動態地加載自身的SWF文件並加載其他SWF文件有一定的時間。
它是這樣的:
我沒有問題讓應用程序#1加載應用程序#2
但是,請嘗試嘗試,我無法讓應用程序2加載和實例化#3
我已經使用ModuleManager嘗試了各種排列,但這是我得到的最接近的排列。 調用onLoadComplete方法時,可以看到已加載SWF,但是工廠始終返回NULL。
有趣的是,當我將其提取到自己的應用程序中時,它可以正常工作。 這個問題是由於我正在從本身動態加載的SWF中加載插件而觸發的。
我相信這是由於ApplicationDomain
造成的,但我無法做出正面或反面的結論。 我嘗試指定currentDomain
, new ApplicationDomain(Application.currentDomain)
和new ApplicationDomain()
沒有成功。
另外,必須注意,我無法在兩個應用程序中都對Foo類進行硬引用,因為從本質上來說,我們不會事先知道它們將包含什么。
Googlin在周圍,這似乎是一個眾所周知的問題,但是我還沒有找到一個(明確的)解決方案。
.
.
.
assetModule = ModuleManager.getModule("Foo.swf");
assetModule.addEventListener(ModuleEvent.READY, onLoadComplete );
assetModule.addEventListener(ModuleEvent.ERROR, onLoadError);
assetModule.load();
.
.
.
private var _pluginInstance:Plugin;
private function onLoadComplete( event:Event ):void
{
trace("module loaded");
_pluginInstance = assetModule.factory.create() as Plugin;
if( _pluginInstance )
_pluginInstance.startup();
else
Alert.show("unable to instantiate module");
}
private function onLoadError( event:Event ):void
{
Alert.show("error");
}
My Plugin looks like this:
package
{
import mx.collections.ArrayCollection;
import mx.modules.ModuleBase;
public class Plugin extends ModuleBase
public function startup():void
{
}
.
.
.
}
和
package
{
import Plugin;
import mx.modules.ModuleBase;
public class Foo extends Plugin
{
public function Foo()
{
trace("foo constructor invoked");
}
override public function startup():void
{
trace("foo started");
}
.
.
.
}
如果您確實想在插件和應用程序之間使用通用接口,則應用程序的Plugin類必須與插件的Plugin類相同。 為此,他們需要b處於同一ApplicationDomain中。
//In an external library
public interface Plugin {}
//In your application
_pluginInstance = assetModule.factory.create() as Plugin;
...
//In your plugin
public class MyPlugin implements Plugin
問題是,當您編譯插件瑞士法郎時,您還將編譯插件。 這不是問題,但是您需要告訴您的應用程序與他的相同:
var loader:Loader = new Loader();
loader.addEventListener(Event.COMPLETE, onLoadComplete);
loader.load(new URLRequest("plugin.swf"), new LoaderContext(false, ApplicationDomain.currentDomain));
ApplicationDomain.currentDomain是此處的鍵。 如果您參考文檔 :
加載程序自己的ApplicationDomain。 使用ApplicationDomain.currentDomain時,您將使用此應用程序域。 加載完成后,父級和子級可以直接使用彼此的類。 如果子級嘗試使用與父級已定義的類相同的名稱來定義一個類,則將使用父級,而子級將被忽略。
@ joshtynjala是正確的。 我發現嘗試僅使用Object然后在其上調用方法(不要強制轉換)。
var MyPlugin:Object = getPlugin(); MyPlugin.doPluginFunc();
通常可以在系統/彈性類之間進行轉換沒有問題。 不知道將Plugin用作運行時庫是否有幫助?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.