silverlight动态加载(研究与探讨)

本文介绍了Silverlight程序中动态加载XAP包及DLL的方法,并通过具体代码实例展示了两种不同的加载方式。作者分享了自己在实验过程中的体会,指出在部分采用Silverlight技术的网页中动态加载XAP更为合适。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络上流传的是sl动态加载xap包来实现silverlight程序动态加载

它的代码:

    // 可以通过 Deployment.Current 检索 AppManifest.xaml 中的 Deployment 对象

            // 取得 XAP 的 AppManifest.xaml 中的 Deployment.Parts 内的全部 AssemblyPart 节点信息
            StreamResourceInfo resource = App.GetResourceStream(new StreamResourceInfo(e.Result, null),new Uri("AppManifest.xaml", UriKind.Relative));
            string resourceManifest = new StreamReader(resource.Stream).ReadToEnd();
            List<XElement> assemblyParts = XDocument.Parse(resourceManifest).Root.Elements().Elements().ToList();

            //加载程序集
            Assembly assembly = null;
            foreach (XElement element in assemblyParts)
            {
                // 取出 AssemblyPart 的 Source 指定的 dll
                string source = element.Attribute("Source").Value;
                AssemblyPart assemblyPart = new AssemblyPart();
                StreamResourceInfo streamInfo = App.GetResourceStream(new StreamResourceInfo(e.Result, "application/binary"),new Uri(source, UriKind.Relative));
                if (source == ProjectName + ".dll")
                {
                    assembly = assemblyPart.Load(streamInfo.Stream);
                }
                else
                {
                    //释放dll
                    assemblyPart.Load(streamInfo.Stream);
                }
            }

    object o = assembly.CreateInstance(TypeName);

但我实验过,动态加载dll的话

     AssemblyPart assemblyPart = new AssemblyPart();
            Assembly assembly = assemblyPart.Load(e.Result);

            object o = assembly.CreateInstance(TypeName);

 三行代码就实现了动态加载程序集,然而加载的容量:

 

再看一下xap包中的东西:

管用的只有Sample2.dll这一个东西,居然把所有dll打包到xap,再传到客户端,多此一举,另外还增加了解析xap这步骤.(不过加载xap也能实现)

我觉得动态加载xap这个方法可以用到局部使用了silverlight的网页,而如果是全部silverlight的话应该动态加载dll来实现.Sample2.dll是集项目所有用到的dll的集合的打包体.这是我这几天研究silverlight动态加载的一些体会.

还有未解决的就是:如果是app.xaml里写的资源文件,好像读不到,希望大家一起讨论

我的实现代码:1.先webclient下载dll

                            TypeName = code[0];
                            Uri uri = new Uri(ProjectPath + code[2] + ".dll");
                            WebClient client = new WebClient();
                            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
                            client.OpenReadAsync(uri);

                  2.异步得到dll的stream,然后再反射出来到界面

                           void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
                          {
                               AssemblyPart assemblyPart = new AssemblyPart();
                               Assembly assembly = assemblyPart.Load(e.Result);

                               object o = assembly.CreateInstance(TypeName);

                         }

转载于:https://www.cnblogs.com/wuli00/archive/2009/10/28/1591325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值