如何访问一个互联网上的xap文件

本文详细介绍了在Silverlight中如何访问外部xap文件,特别是如何访问互联网上的xap文件。首先,文章阐述了需求背景,接着分析了在实现过程中可能遇到的两个问题:xap文件的下载和程序集的访问。然后,文章通过代码示例展示了如何使用WebClient下载xap文件,解析AppManifest.xaml以获取程序集,并通过反射加载外部UserControl。此外,还讨论了跨域访问的问题,包括clientaccesspolicy.xml文件的配置。最后,文章提到了跨域访问时可能出现的错误检查和解决方案,强调了配置文件和服务端策略文件的重要性。
摘要由CSDN通过智能技术生成

概述

众所周知,在Silverlight 2开始每个项目编译后都会打包成为一个xap文件,如果我们要访问当前xap文件中的UserControl比较容易,那我们如何访问一个外部xap文件中的内容呢?甚至于如何访问一个互联网上的xap文件呢?

本文将简单介绍一下在Silverlight中如何访问外部xap文件。

需求

现在我们先来看一下需求,大致是这样子的,在服务端我们有两个xap文件,其中MainProject.xap文件将会在MainProjectTestPage.aspx中引用,而ExternalProject.xap文件中的UserControl将会在MainProject.xap文件中访问,并进行显示,如下图所示:

现在我们来建立相关的项目,最终完成的项目结构如下图所示:

 

这样在编译后,将会在ClientBin文件夹下产生两个.xap文件,现在我们将在MainProject.xap文件中访问ExternalProject.xap中的UserControl

分析

在实现这个过程中,我们将会遇到两个问题:

1.因为没有任何页面引用ExternalProject.xap文件,所以它不会下载到客户端,这一点我们可以通过编码的方式来下载它。

2.访问ExternalProject.xap中的UserControl,我们需要找到对应的程序集,以便使用反射,我们知道在xap文件是一个标准的zip文件,它会包含相关的程序集(接下来我会写一篇文章专门解释xap文件),如下图所示:

现在解决了xap文件的下载已经程序集的访问问题,我们可以着手来实现了。

实现

实现的过程也是相当简单,首先我们使用WebClient去下载xap文件,相信大家都知道该怎么做了,如下代码所示

void myButton_Click(object sender, RoutedEventArgs e)

{

    Uri address = new Uri("http://localhost:4161/ClientBin/ExternalProject.xap");

    WebClient webClient = new WebClient();

    webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);

    webClient.OpenReadAsync(address);

}

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

{

    // 得到下载结果

}

这一步比较简单,接下来我们将根据下载的结果,得到相应的程序集。我们知道在xap文件中的AppManifest.xaml文件相当于一个清单,列出了当前xap文件用到的程序集(下篇文章将会介绍),它的内容如下所示:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            EntryPointAssembly="ExternalProject"

            EntryPointType="ExternalProject.App"

            RuntimeVersion="2.0.30523.6">

  <Deployment.Parts>

    <AssemblyPart x:Name="ExternalProject" Source="ExternalProject.dll" />

  </Deployment.Parts>

</Deployment>

注意,在Deployment.Parts节点下包含了当前应用程序中所有的程序集。首先要根据下载的结果获取AppManifest.xaml文件中的内容,如下代码所示:

Stream stream = Application.GetResourceStream(

        new StreamResourceInfo(packageStream, null),

        new Uri("AppManifest.xaml", UriKind.Relative)).Stream;

String appManifestString = new StreamReader(stream).ReadToEnd();

有了AppManifes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值