繁体   English   中英

AS3从外部SWF实例化类

[英]AS3 Instantiate Class From External SWF

我正在和我的好友聊聊这件事,他确信你可以做到这一点,并说他已经做到了,但是我无法让它发挥作用。

我想知道它是否甚至可能。 我尝试在外部下载的SWF中键入一个var作为一个类,然后创建一个实例但不能做。

一些代码

private static function onCompleteHandler(e:Event) {
dashboardObject = e.target.content;
// registerClassAlias("Dashboard", ); doesnt work
var dash:Class = getDefinitionByName("Dashboard") as Class;
var myDash = new dash();
trace(myDash.show);
}

错误

ReferenceError: Error #1065: Variable Dashboard is not defined.
at global/flash.utils::getDefinitionByName()
at System$/onCompleteHandler()

因此,除非在项目SWF中编译,否则您似乎无法创建类的实例。 如果这是真的是我想要它做的事情。 我不希望人们试图通过下载SWF文件来创建我的类的实例,而不是我在这里构建的内容。

谢谢

你需要做两件事:

  1. Dashboard一个包( package.to.Dashboard )。 无包类具有编译形式的不同属性(受保护的命名空间),而不是具有包的属性,使得外部SWF无法访问它们。
  2. 确保已加载的SWF已加载到与父项相同的ApplicationDomain中

然后,您应该能够使用getDefinitionByName加载的SWF中的getDefinitionByName并返回new的返回Class

var loader:Loader = new Loader();
var req:URLRequest = new URLRequest("foo.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fooLoadComplete);
loader.load(req);


function fooLoadComplete(e:Event):void
{
    var ClassDefinition:Class = e.target.applicationDomain.getDefinition("Symbol1") as Class;
    var sym1:MovieClip = new ClassDefinition();

    this.addChild(sym1);
}

因此,除非在项目SWF中编译,否则您似乎无法创建类的实例。

试试ModuleLoader类。 请参阅文章如何创建模块。

我建议使用CASALib 我创建了一个完整的应用程序,直到运行时我都不知道类名。 我刚刚制作了一些接口,以确保最重要的功能始终可用。 名为LibraryManager的CASALib util具有从外部SWF实例化类的功能。

你可能想这样做:

var dash:Class = Loader(e.target).contentLoaderInfo
    .applicationDomain.getDefinition("Dashboard")  as  Class;

getDefinitionByName()适用于当前swf而不是外部swfs加载的类。 对于外部swf,您需要提供实际加载特定swf的loader对象的引用。

另外,如果你在FlashBuilder中这样做,请确保你加载的SWF中的“主应用程序”是一个Sprite (或者可能是一个MovieClip,虽然我没有测试),而不是一个应用程序(就像你一样)获取为新SWF项目创建的默认MXML文件。 否则,上面的代码将无法找到您正在寻找的类定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM