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(); 
}

 

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

posted on 2011-08-25 15:23  农民工老李  阅读(959)  评论(7编辑  收藏  举报

导航