Silverlight动态加载XAP,利用反射技术呈现

本文介绍如何使用WebClient下载Xap包,并将其转换为组件加载到当前AppDomain中。文章详细展示了从下载到加载的整个过程,包括处理OpenReadCompleted事件。

1. 首先通过WebClient下载Xap包。

        /// <summary>
        /// 下载应用
        /// </summary>
        /// <param name="name"></param>
        private void DownloadApp(string name)
        {
            // 判断是否已下载

            WebClient wc = new WebClient();
            wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
            wc.OpenReadAsync(new Uri(name, UriKind.Relative), name);
        }

2. 处理 OpenReadCompleted 事件。

        /// <summary>
        /// 设置异步下载完成中并引发 OpenReadCompleted 事件时所要执行的事件处理程序。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            // 隐藏下载进度条

            if (e.Error == null && e.Cancelled == false)
            {
                // 在此要将下载的数据流转换成一个组件并加载到目前的AppDomain中。
                // 将下载的数据流转换成一个组件。
                Assembly assembly = LoadAssemblyFromXap(e.UserState.ToString(), e.Result);

                // 创建 Silverlight 类库组件DLL中的用户控件类的实例。
                UserControl page = (UserControl)assembly.CreateInstance("");

                // 将实例添加到 Canvas 对象中,并显示。
                canvasMain.Children.Add(page);
            }
        }

 

其中 LoadAssemblyFromXap用于将流转换成组件。

        /// <summary>
        /// 将数据流转换成组件
        /// </summary>
        /// <param name="relativeUriString"></param>
        /// <param name="xapPackageStream"></param>
        /// <returns></returns>
        private Assembly LoadAssemblyFromXap(string relativeUriString, Stream xapPackageStream)
        {
            Uri uri = new Uri(relativeUriString, UriKind.Relative);
            StreamResourceInfo xapPackageSri = new StreamResourceInfo(xapPackageStream, null);
            StreamResourceInfo assemblySri = Application.GetResourceStream(xapPackageSri, uri);

            AssemblyPart assemblyPart = new AssemblyPart();
            Assembly assembly = assemblyPart.Load(assemblySri.Stream);
            return assembly;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值