本文转载自:http://www.pin5i.com/showtopic-26068.html 有些时候我们在设计有集成sl系统的时候总会想把xap作为基点来达到持续集成的效果。那么我们应该怎么做呢? 解决方法: 1.首先我们要用一个方法实现从源资中提取出Assembly: 1: Assembly LoadAssemblyFromXap(Stream packageStream, String assemblyName) 2: { 3: StreamResourceInfo resouceInfo = new StreamResourceInfo(packageStream, "application/binary"); 4: Stream mainfestStream = Application.GetResourceStream(resouceInfo, new Uri("AppManifest.xaml", UriKind.Relative)).Stream; 5: String appManifestString = new StreamReader(mainfestStream).ReadToEnd(); 6: 7: XElement deploymentRoot = XDocument.Parse(appManifestString).Root; 8: List deploymentParts = (from assemblyParts in deploymentRoot.Elements().Elements() select assemblyParts).ToList(); 9: 10: Assembly targetassembly = null; 11: 12: foreach (XElement xElement in deploymentParts) 13: { 14: String source = xElement.Attribute("Source").Value; 15: if (source == assemblyName) 16: { 17: StreamResourceInfo streamInfo = Application.GetResourceStream(resouceInfo, new Uri(source, UriKind.Relative)); 18: AssemblyPart asmPart = new AssemblyPart(); 19: targetassembly = asmPart.Load(streamInfo.Stream); 20: } 21: } 22: return targetassembly; 23: } 复制代码 2.利用一个webClient下载指定的其他xap文件,并在下载完成后,利用上边的方法把加载后的资料还完成一个UIElement,这样我们就可以使用了. 1: void MainPage_Loaded(object sender, RoutedEventArgs e) 2: { 3: //加一个xap文件所在的位置 4: Uri address = new Uri("http://localhost:4456/ClientBin/exproject.xap"); 5: //实例一个webClient 6: WebClient webClient = new WebClient(); 7: //注册一个下载完成事件 8: webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted); 9: //开始下载 10: webClient.OpenReadAsync(address); 11: } 复制代码 3.下载完成后通过LoadAssemblyFromXap方法还原xpa为UIElement: 1: void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 2: { 3: Stream stream = Application.GetResourceStream( 4: new StreamResourceInfo(e.Result, null), 5: new Uri("AppManifest.xaml", UriKind.Relative)).Stream; 6: String appManifestString = new StreamReader(stream).ReadToEnd(); 7: 8: Assembly assembly = LoadAssemblyFromXap(e.Result, "exproject.dll");//other project name.dll 9: UIElement element = assembly.CreateInstance("exproject.MainPage") as UIElement;//other project name.mainPage 10: this.contaner.Children.Add(element); 11: } 复制代码