关于导入swf时安全域与应用域的问题


关于导入swf时安全域与应用域的问题
2011年05月02日
  比如:
  _classLoader.load(new URLRequest(swfName));
  如果此时swfName类似一个http://ip:port/xxxx/swfName.swf的名字,那么此时你的应用与这个swf文件是处于两个不同的安全域,此时,当导入成功后,假设在swfName.swf中你有一个类org.example.Test类,那么你可以通过_classLoader.contentLoaderInfo.applicationDomain.g etDefinition("org.example.Test")得到该类,但是如果涉及到一些类的定义时,比如你需要调用getDefinitionByName(Test类的实例)时,此时会报Variable Test is not defined,或者你使用flexOrm直接保存Test对象时,此时会报SQLError: 'Error #3115: SQL Error.', details:'', operation:'begin'错误。原因是Test类的应用域与当前应用域不是同一个域,就导致了当前域中找不到Test类,而flexOrm里面的元数据标签Table,Column等标签是与这个的设计信息相关的,此时flexOrm就找不到Test类的定义信息,数据自然保存不进去,所以如果只是对Test类的直接操作就没问题,如果操作一些涉及到类的定义信息时就会有问题。那么如何解决呢 ,经过一下午的测试,发现只要把导入进来的swfName.swf的应用域设置为当前的应用域就可解决了。 此时只需要在
  _classLoader.load(new URLRequest(swfName));该为:
  var ldrC:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomai n); 
  _classLoader.load(new URLRequest(swfName),ldrC);
  注意:ApplicationDomain.currentDomain 这句不能换成new ApplicationDomain(ApplicationDomain.currentDomain) , 这样写仍然是两个不同的应用域。这样就能保证万无一失了。

猜你喜欢

转载自dx671dx.iteye.com/blog/1363150