新しい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();
}
}
}