as3 动态类库使用

参阅:http://hi.baidu.com/lozu/blog/item/16787fad1541410e4a36d626.html

 

原理:类A 被类B引用 也被C引用
那么实际上 会在B中装载一份类A 
                    在C中也装载一份类A

这样公共引用的类A 会被大量的复制到使用它的类中。
无形中,增加了文件的大小。

 

为了给swf瘦身。我们使用RSL。RSL是 Runtime Shared Library的简称。

步骤:建立类库 Lib   》

         生成配套的swf 》 新建空的as项目 ,设置编译参数引入Lib  ,发布出useLib.swf

         新项目使用

1:建立一个NaikingDll 类库项目。

     建立一些类如:com.naiking.ntil.NaikingHello
     

 1 package com.naiking.core
 2 {
 3     public class NaikingHello
 4     {
 5         public function NaikingHello()
 6         {
 7         }
 8         public static function hello(_name:String):String
 9         {
10             return("Hello "+_name);
11         }
12     }
13 }


     选择:项目--构建项目。
              这时FlashBuilder会构建出一个新生成的NaikingDll.swc文件
2:生成配套的swf 
     建立一个新的actionscript项目NaikingSwf
     设置编译参数为-include-libraries ../NaikingDll/bin
     这样就把swc里的类都引入进来了。
     发布出一个swf:NaikingSwf.swf

     查看这个swf ,会发现里面有了NaikingDll.swc里的代码

     PS:可以导入多个需要的swc库,从项目--属性里添加

            并在 输出文件夹:浏览到 新建项目的bin,这样可以把每个swc 都会导出 对应的多个swf

3:新项目使用这种RSL
     所需要的是NaikingDll.swc 和 NaikingSwf.swf

     这样做是不是重复了?swc 和 swf 里都是相同的代码。
     swc是以引用库方式引入到项目中,并没有嵌入到项目,

           链接进来的原因是方便写代码的时候,方便调用那些dll里的类。

           发布出的Client.swf运行的时候,是找不到swc的(swc并没有被嵌入进Client.swf)

      swf是实际Client.swf运行时靠加载后,读取其内部的类的。

 

      具体做法:

      引用所有使用的swc:使用项目--属性--库路径导入

===========================================

所有的类库swc和对应的swf ,都生成后,

新建一个自己的项目(flex ,as)都可以,设置swc的引用,在项目--属性--库路径导入

bin目录有对应的swf文件

 

使用,随便创建自己的类,这些类都引用了那些swc里的类。

PS:项目的主类不可以使用,尽管你可以import.....发现这些类。

swc实际是通过加载swf们后,才可以用。

 

新工程的类

package
{
    import com.naiking.core.NaikingHello;
    
    import flash.display.Sprite;
    import flash.text.TextField;

    public class Facade extends Sprite
    {
        public function Facade()
        {
            var txt:TextField=new TextField();
            txt.text=NaikingHello.hello("naiking");
            addChild(txt);
        }
    }
}

主类:

 

public function Client()
        {
            var loader = new Loader();
            
             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);
            
              loader.load(new URLRequest("UsingDll.swf"),
                
                new LoaderContext(false, ApplicationDomain.currentDomain));
            
                   }
        
           
        
               private function onLoader(event:Event):void
        
                {
                       
                        addChild(new Facade());
            
                }
        

        }






 

原文地址:https://www.cnblogs.com/naiking/p/2644690.html