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;
}
动态加载XAP文件
最新推荐文章于 2021-03-21 08:43:32 发布