动态加载XAP文件
来源:互联网 发布:mac磁盘工具看不见硬盘 编辑:程序博客网 时间:2024/06/02 10:52
myButton.Click += new RoutedEventHandler(myButton_Click); void myButton_Click(object sender, RoutedEventArgs e) { WebClient client = new WebClient(); client.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted); //打开打包的xap文件 client.OpenReadAsync(new Uri("Binglang.ExternalProject.xap", UriKind.Relative)); } void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { //通过AppManifest.xaml文件取出动态库的信息 Assembly asm = LoadAssemblyFromXap(e.Result, "Binglang.ExternalProject.dll"); ////使用反射创建相关的实例,并在页面上加载 holder.Children.Clear(); UIElement element = asm.CreateInstance("Binglang.ExternalProject.MainPage") as UIElement; this.holder.Children.Add(element); } /// <summary> /// 通过AppManifest.xaml文件取出动态库的信息 /// </summary> /// <param name="packageStream">OpenReadCompletedEventArgs e.Result</param> /// <param name="assemblyName">动态库文件名</param> /// <returns></returns> Assembly LoadAssemblyFromXap(Stream packageStream, string assemblyName) { //解包,读取AppManifest.xaml文件信息 string appManifest = new StreamReader(Application.GetResourceStream(new StreamResourceInfo(packageStream, null), new Uri("AppManifest.xaml", UriKind.Relative)).Stream).ReadToEnd(); //------------解析AppManifest.xaml信息内容 XElement deploymentRoot = XDocument.Parse(appManifest).Root; List<XElement> deploymentParts = (from assemblyParts in deploymentRoot.Elements().Elements() select assemblyParts).ToList(); Assembly asm = null; foreach (XElement xElement in deploymentParts) { string source = xElement.Attribute("Source").Value; AssemblyPart asmPart = new AssemblyPart(); StreamResourceInfo streamInfo = Application.GetResourceStream(new StreamResourceInfo(packageStream, "application/binary"), new Uri(source, UriKind.Relative)); if (source == assemblyName) { asm = asmPart.Load(streamInfo.Stream); } else { asmPart.Load(streamInfo.Stream); } } return asm; }