swf間でのライブラリ・クラスの共有

※ここでいうライブラリとはFlashCS3のライブラリパネルを指すものとします


ActionScript2ではswf間でライブラリの共有ができなかったため、ライブラリの共有部分をflaファイル間でコピーしあったりと何かと不便でした。
ActionScript3ではそこらへんの問題も解決されています。

var loader:Loader = new Loader();
request = new URLRequest("outerLibrary.swf");
var context:LoaderContext = new LoaderContext();
//現在のアプリケーションドメインを取得
context.applicationDomain = ApplicationDomain.currentDomain;
loader.load(request, context);


AS3では、クラスはApplicationDomainとよばれるクラスのコンテナのようなものに格納され、それぞれのApplicationDomain単位でクラスはサンドボックス化されます。


Loder.load()実行時、外部のswfに含まれるクラスは通常は新たに生成されるApplicationDomain内に読み込まれ、それぞれのswfはサンドボックス化されます。


ただし、Loader.load()の第二引数のLoaderContextのApplicationDomainを指定することによって、指定したApplicationDomain内にクラス群を読み込むことが可能です。


外部から読み込んだ後、現在と同じApplicationDomainに読み込んでおけば別のswfから読み込まれたライブラリのアイテムにもアクセス可能になるので、簡単に共有が可能です。
(ActionScript3では、ライブラリのリンケージはクラスとして書き出される)


ただし、動的に読み込む前のコンパイル時には、外部のライブラリのアイテムはないので普通にnewするとコンパイルエラーになってしまうので下記のように、動的なクラスの取得を行います。

import flash.utils.getDefinitionByName;
var outerLibMcClass:Class = getDefinitionByName("outerLibLinkageMc") as Class;
var outerLibMc:MovieClip = new outerLibMcClass() as MovieClip;

このような方法を使う場合下記の挙動を気をつける必要があります。

  • 同じアプリケーションドメインに読み込む場合、すでにApplicationDomain内に存在するクラスが新たに読み込まれた場合すでに定義されているクラスが優先されます
  • ただし、現在のApplicationDomain内に存在するクラスがライブラリのアイテムと紐づいていない場合(クラス定義はされているがライブラリのActionScript3クラスとしては指定されていない)、新たに読み込まれたswf内に紐づいたアイテムがあった場合、クラス定義はそのままに、ライブラリのアイテムとの紐づきのみが行われます。


同じような方法でライブラリ共有も可能です。
外部からよみこんだクラスに対してコンパイルチェックを最大限有効にする方法はそのうち。