Silverlight 动态加载程序集 -----实现按需下载
在silverlight中,实现按需下载程序集,我们做思路一般是这样,首先将要加载的dll文件,读到二进制流里,然后使用Response发送到前端,silverlight使用AssemblyPart类从流中加载程序程序,最后通过返射实现对方法的调用。代码如下:
{ //加载程序集Options
AssemblyPart part =new AssemblyPart();
Assembly ass = part.Load(e.Result);
object obj = ass.CreateInstance("Options.Calc");
MethodInfo m = 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.对我们上一面的代码进行改进,具体如下:
{
//加载程序集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();
}
经过上面的改进,我们就实现 即强类型,又动态加载程序集。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步