在Silverlight中我们时常会遇到需要加载其他已经制作完成的Silverlight程序的情况,在本节中我们使用WebClient下载XAP 包形式的Silverlight程序,然后使用反射的方式解析出这个Silverlight的程序加载到本Silverlight程序中。步骤如下:

        1 •首先我们使用WebClient类的OpenReadAsync(Uri)方法读取某个Uri位置的XAP文件,可以得到这个XAP的Stream值。

        2 •使用Application.GetResourceStream(StreamResourceInfo, Uri)从 指定 zip/XAP 包中的某个位置返回资源文件。(这个函数有两个参数:第一个参数是new StreamResourceInfo(Stream)获取到WebClient下载下来的XAP Stream。第二个参数:在这个XAP包中的某一个位置的需要运行的文件的DLL的Uri。)

        3 •上一步骤运行函数Application.GetResourceStream得到的返回值也是一个StreamResourceInfo类型的值,将此值运行.Stream属性获取到它的Stream流。

        4 •AssemblyPart.Load(Stream)方法将 Stream 转换为随后将加载到当前应用程序域中的 Assembly。

        5 •(UserControl)assembly.CreateInstance(mainStr)根据mainStr名从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

        下面我们创建一个名为SLoadXAP的Silverlight应用程序,在SLoadXAP.Web项目的ClientBin文件夹中,放入第29节中我们制作成功的雷达XAP包,然后编写一下代码即可成功动态加载XAP包。

 

  1. public partial class MainPage : UserControl 
  2. public MainPage() 
  3. InitializeComponent(); 
  4.  
  5. private void button1_Click(object sender, RoutedEventArgs e) 
  6. //1 •使用WebClient下载SLRandarHitTest.xap文件,进行异步读取。 
  7. WebClient Appclient = new WebClient(); 
  8. Appclient.OpenReadAsync(new Uri("SLRandarHitTest.xap", UriKind.Relative)); 
  9. Appclient.OpenReadCompleted += new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted); 
  10.  
  11.  
  12. void Appclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
  13. CreateXAPResource("SLRandar.dll","SLRandar.MainPage",e.Result); 
  14. /// <summary> 
  15. /// 创建XAP包的反射实例并且加装到Canvas中 
  16. /// </summary> 
  17. /// <param name="dllStr">XAP包中的编译完成的运行代码的DLL文件</param> 
  18. /// <param name="mainStr">需要实例化的启动页面</param> 
  19. /// <param name="resultStream">使用WebClient下载到的数据流</param> 
  20. private void CreateXAPResource(string dllStr,string mainStr,Stream resultStream) 
  21. //2 • 
  22. //3 •获取其他包提供的资源流信息 
  23. StreamResourceInfo streamResourceInfo = Application.GetResourceStream(new StreamResourceInfo(resultStream as Stream, null), new Uri(dllStr, UriKind.RelativeOrAbsolute)); 
  24. //4 •对Stream进行反射 
  25. AssemblyPart assemblyPart = new AssemblyPart(); 
  26. Assembly assembly = assemblyPart.Load(streamResourceInfo.Stream); 
  27. //5 •(创建实例 
  28. var uc = (UserControl)assembly.CreateInstance(mainStr); 
  29. lRoot.Children.Clear(); 
  30. lRoot.Children.Add(uc); 
  31.  

        本实例采用VS2010+Silverlight 4.0编写,如需源码点击 SLoadXAP.zip 下载。