动态加载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;             }     

原创粉丝点击