簡體   English   中英

在Flex中創建插件-加載嵌套的SWF文件

[英]Create Plugins in Flex - loading nested SWF files

我正在嘗試為我們的應用程序實現一個插件系統,讓自己動態地加載自身的SWF文件並加載其他SWF文件有一定的時間。

它是這樣的:

  1. 主要應用外殼載荷...
  2. --------- +應用程序加載中...
  3. ----------------- +插件

我沒有問題讓應用程序#1加載應用程序#2

但是,請嘗試嘗試,我無法讓應用程序2加載和實例化#3

我已經使用ModuleManager嘗試了各種排列,但這是我得到的最接近的排列。 調用onLoadComplete方法時,可以看到已加載SWF,但是工廠始終返回NULL。

有趣的是,當我將其提取到自己的應用程序中時,它可以正常工作。 這個問題是由於我正在從本身動態加載的SWF中加載插件而觸發的。

我相信這是由於ApplicationDomain造成的,但我無法做出正面或反面的結論。 我嘗試指定currentDomainnew 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM