0

Alchemyでは、ほとんどのビルドは静的なswcビルドです。これらはライブラリに直接リンクするのに最適ですが、一度に複数を使用しようとすると、通常(常に?)共有メモリスペースで問題が発生します。私が読んだ解決策の1つは、代わりにswfをビルドし、それらを独自のApplicationDomainに動的にロードすることです。これにより、すべてのライブラリに独自のメモリが与えられ、複数のAlchemyライブラリをロードできるようになります。(adobeフォーラムのこれらのスレッドで言及されているように:http://forums.adobe.com/message/3665801およびhttp://forums.adobe.com/message/3927791

私の質問は、これらのswfをロードして、その中のコードにアクセスするにはどうすればよいですか?この問題に関するドキュメントはないようです。swfをロードする方法は知っていますが、swfへのインターフェイスがないため、コードにアクセスする方法がわかりません。

4

2 に答える 2

0

問題は、Alchemy libを動的にロードしたいのですが、ライブラリをSWFとしてビルドすると、機能しなくなります(スタンドアロンアプリになるため)。しかし、SWCを動的にロードすることはできません。

これが何をするかです(という名前のライブラリを想定していますmylib):

  1. mylibSWCとしてビルドします。
  2. ファイルを解凍mylib.swcして解凍しlibrary.swfます。名前を変更しますmylib.swf
  3. バイナリアセットmylib.swfとして埋め込む
  4. 実行時に、アセットを次のようにインスタンス化しますByteArray
  5. アセットByteArrayLoader#loadBytesに渡します
  6. ローダーがCOMPLETEを起動したら、 Loader#contentLoaderInfoを使用して、ロードされたSWFのApplicationDomainを取得します。
  7. ApplicationDomain#getDefinitionを使用して、Alchemy初期化子クラスを検索します。例えば、cmodule.mylib.CLibInit
  8. 通常どおりに初期化子を使用します。たとえば、電話initなど。
  9. ...利益!

この方法で任意の数のAlchemyライブラリを埋め込むことができ、それぞれが独自のApplicationDomainで実行されます。

于 2012-08-22T15:36:32.360 に答える
0

新しいApplicationDomainを作成し、それをロード用のローダーコンテキストに渡すことで、ライブラリを動的にロードしようとしていました。私が間違っていたのは、そのApplicationDomainへの参照を保存し、その参照から定義を取得しようとしたことでした。なんらかの理由でnullを返していました。paleozogtの回答を実装し、それを変更してswfを動的にロードすることで、ApplicationDomainへの保存された参照を使用せず、ローダーのcontentLoaderInfoから取得する正しいコードになりました。

ライブラリを動的にロードする場合のコードは次のとおりです。

package
{
    import flash.display.Loader;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class AlchemyDynamicLoad
    {
        private var _library:Object;
        private var _loader:Loader;

        public function AlchemyDynamicLoad()
        {
            var loaderContext:LoaderContext = new LoaderContext(false, new ApplicationDomain());
            var request:URLRequest = new URLRequest("../assets/mylib.swf");
            _loader = new Loader();
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            _loader.load(request, loaderContext);
        }

        private function completeHandler(event:Event):void
        {
            // NOTE: Storing a reference to the application domain you feed to the loaderContext and then trying to get the 
            // definition from that reference is not going to work for some reason. You have to get the applicationDomain
            // from the contentLoaderInfo, otherwise getDefinition returns null.
            var libClass:Class = Class(_loader.contentLoaderInfo.applicationDomain.getDefinition("cmodule.mylib.CLibInit"));
            _library = new libClass().init();
        }
    }        
}

そして、それを埋め込みたい場合のコードは次のとおりです(paleozogtの答え):

package
{
    import flash.display.Loader;
    import flash.events.Event;

    public class AlchemyStaticLoad
    {
        [Embed(source="../assets/mylib.swf", mimeType="application/octet-stream")]
        private static var _libraryClass:Class;

        private var _library:Object;
        private var _loader:Loader;

        public function AlchemyStaticLoad()
        {
            _loader = new Loader();
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            _loader.loadBytes(new _libraryClass());
        }

        private function completeHandler(event:Event):void
        {
            var libClass:Class = Class(_loader.contentLoaderInfo.applicationDomain.getDefinition("cmodule.mylib.CLibInit"));
            _library = new libClass().init();
        }
    }
}
于 2012-08-23T07:51:06.350 に答える