• Silverlight中实现动态添加DLL,并且实现缓存


    在silverlight中经常会添加一些其他的dll或者第三方的类库,我们知道silverlight作为客户端的插件,每次访问都需要去下载xap包中的资源或者是文件,当然这个访问的速度快慢和这个xap包的大小有直接关系,所以要尽可能的使xap包小点,ok,今天来说下,怎么实现动态加载dll以及实现缓存.

    一.实现加载Dll

       其实加载的dll的原理很简单,没错,就是使用我们强大的WebClient进行下载,然后使用AssemblyPart进行Load就可以了,就是这么简单,为了减小Xap的大小,我们把要加载的dll的所属程序的编译路径设置为ClientBin(如果当前的dll为第三方,则直接赋值到Clientbin下)不说废话,开始....
      1.修改要添加的类库的编译路径为Clientbin,右键类库,选择最后一个属性
     


    看到如下,选择Bild(生成选项),在右边找到OutPut path(输出目录),点击浏览,找到ClientBin文件夹点击确定即可,保存属性,ok,第一步完成.
     
     2.在Silverlight端加载Dll,代码注释很清楚
     
       void InitAssembly()
    {
    //得到当前的Xap的所属的位置,格式为 http://localhost:8080/ClientBin
    string url = Application.Current.Host.Source.AbsoluteUri;
    int index = url.IndexOf("/ClientBin");
    //找到dll的文件
    url = url.Substring(0, index) + "/ClientBin/SilverlightClassLibrary.dll";
    //使用WebClient进行下载
    WebClient client = new WebClient();
    //绑定回调方法
    client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
    //使用OpenReaadAsync异步下载
    client.OpenReadAsync(new Uri(url));
    }

    看看回调方法,回调方法中有一句关键代码
    AssemblyPart.Load(e.result);没错就是这个AssemblyPart(MSDn解释:程序集部件是将要包括在基于 Silverlight 的应用程序的程序包 (.xap) 中的程序集。),说白了,就是可以使用它来注册Silverlight程序要加载的dll或者其他类库.到此我们的动态记载已经完了,可以看到imgDll的地址就是一个dll中的地址,所以,在加载完之后就可以使用这个类库中的资源了.

       void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
    if ((e.Error == null) && (e.Cancelled == false))
    {
    AssemblyPart assemblyPart
    = new AssemblyPart();
    assemblyPart.Load(e.Result);
    imgDll.Source
    = new BitmapImage() { UriSource = new Uri("/SilverlightClassLibrary;component/1.jpg", UriKind.RelativeOrAbsolute) };
    }
    }
     
     
     
    二.对Dll实现缓存,默认的通过AssemblyPart加载的dll是不会被缓存的,也就是说每访问一次就需要Load一次dll,所以必要的缓存是需要的,但是仅仅默认的做法是不够的,没关系Silverlight给我们指定了步骤分为两个步骤
    给类库使用强命名和使用.extmap.xml文件(此文件貌似就是配置一些缓存后的信息)
    1.强命名
     右键类库的右键属性,点击New
     
     
     
    点击New之后如下:输入key文件的名字(随意,最好和Assembly的名字一致),密码是选填的.点击Ok,打开当前类库的目录发现多了一个文件
    打开目录如下
    接下来开始给Assembly注册一个Key,这个有点繁琐了
    Microsoft Visual Studio 2010 ➤ Visual StudioTools ➤ Visual Studio Command Prompt. 找到Vs 2010的命令工具
    然后把当前运行的目录设置为类库的目录,然后需要执行两个命令,一个是 sn -p mykey.pfx mykey.bin,mykey.pfx文件为程序根目录的文件,mykey.bin是要新生成的,名字最好和这个一致,一个命令是 sn -t mykey.bin,bin文件就是上一个命令执行的文件.截图如下
    执行第一个命令
    执行第二个命令,出现key则说明成功,此时在根目录会有一个bin文件

    2.添加xml文件,主要名字的格式 SilverlightClassLibrary.extmap.xml是extmap.xml,内容如下
    <?xml version="1.0" encoding="utf-8" ?>
    <manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd
    ="http://www.w3.org/2001/XMLSchema">
    <assembly>
    <!--最好和程序集一致-->
    <name>SilverlightClassLibrary</name>
    <version>1.0.0.0</version>
    <!--就是上一步生成的Key-->
    <publickeytoken>0fd6d4d48098ffeb</publickeytoken>
    <!--当前程序编译的dll文件-->
    <relpath>SilverlightClassLibrary.dll</relpath>
    <!--缓存后压缩包的名字-->
    <extension downloadUri="SilverlightClassLibrary.zip" />
    </assembly>
    </manifest>

    有一点很重要,设置xml的Build Action为None,并且设置为总是复制

    ok,到此整个步骤已经结束,如果给我们的silverlight程序启用了缓存,那么我们在动态加载dll的时候dll就会被缓存,就不用每次都去加载了.


     
     
     
  • 相关阅读:
    hdu 2044 一只小蜜蜂
    HDU 2041 超级楼梯
    卡特兰数
    hdu 1267 下沙的沙子有几粒?(二维递推题)
    大数加法、乘法
    学习时仪式感太强是不是不太好
    php记日志
    cygwin安装apt-cyg
    存储过程死循环之后的清理
    linux的计划任务crontab
  • 原文地址:https://www.cnblogs.com/ListenFly/p/2156246.html
Copyright © 2020-2023  润新知