您的位置:知识库 » .NET技术

在Silverlight中如何访问外部xap文件中UserControl

作者: TerryLee  来源: 博客园  发布时间: 2008-10-09 16:23  阅读: 6983 次  推荐: 0   原文链接   [收藏]  

 

分析

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

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

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

TerryLee_0109

现在解决了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();

有了AppManifest.xaml中内容,就可以根据它来构造一个Deployment对象,Deployment对象提供了当前应用程序的Part和本地化信息清单,它的定义如下所示:

TerryLee_0110

 

0
0
 

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻