zoukankan      html  css  js  c++  java
  • Silverlight 动态加载程序集 实现按需下载

    在silverlight中,实现按需下载程序集,我们做思路一般是这样,首先将要加载的dll文件,读到二进制流里,然后使用Response发送到前端,silverlight使用AssemblyPart类从流中加载程序程序,最后通过返射实现对方法的调用。代码如下:

    void assemblyLoader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {       
    //加载程序集Options
          
    AssemblyPart part =new AssemblyPart();
          
    Assembly ass = part.Load(e.Result);
          
    object obj = ass.CreateInstance("Options.Calc");
          
    MethodInfo = obj.GetType().GetMethod("Add");
          
    object res = m.Invoke(obj, newobject[] { double.Parse(txtA.Text), double.Parse(txtB.Text) }); 
          txtResult.Text 
    = res.ToString(); 

    }  

    从上面的代码上看去,似乎没有什么问题,但是,我们去确失去了C#语言的一个非常大的特征,那就是强类型,在上面的代码中,我们不得不去用字符串创建一个类和调用一个方法,这将导致我们无法在编译发现我们代码的错误。同时这里也出现了一个两难的问题,一方面如果我们想要强类型,就必须把程序集引入到silverlight中, 这将导致silverlight文件变大,在一次下载中等待时间可能会过长,另一方面如果我们想要实现按需加载程序集,那么我们又失去了强类型的好处,那么有没有一种办法让们,即能实现强类型,又能实现按需要加载程序集呢?答案是:有。具体做法如下

     1.在开发环境中,我们依然要把我们的程序集添加引用到我们的silverlight中,但是我们需要多做一步是将引入的程序集的"Copy Lcoal属性值设置为False", 这将保证我们在发布silverlight的xap文件的时候,不包括这个引入的程序集(若想查看xap文件中是否包含引入的程序集,可以使用解压缩工具打开该文件就可以。)

    2.对我们上一面的代码进行改进,具体如下:

    void assemblyLoader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 

    {           
          //加载程序集Options

    AssemblyPart part =new AssemblyPart();
    Assembly ass = part.Load(e.Result);
          
           CalcAdd();
    }  
    [MethodImpl(MethodImplOptions.NoInlining)]
    privatevoid CalcAdd()
    {
    //调用Options程序集中的方法

    Options.Calc calc = new Options.Calc();double res = calc.Add(

    double.Parse(txtA.Text), double.Parse(txtB.Text) );
           txtResult.Text = res.ToString(); 
    }

    经过上面的改进,我们就实现 即强类型,又动态加载程序集。 

  • 相关阅读:
    vue 图片切换动态绑定
    弹窗居中,不会随页面滚动变化,直接固定在屏幕中央
    GC优化策略官篇2
    UI优化策略网格重建
    GC优化策略官篇1
    Graphics优化策略官篇3
    GC优化策略官篇3
    Scripts优化策略官篇2
    UI优化策略高级技巧
    Scripts优化策略官篇1
  • 原文地址:https://www.cnblogs.com/itprogrammer/p/2153262.html
Copyright © 2011-2022 走看看