一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

在Silverlight中如何訪問外部xap文件中UserControl

概述

眾所周知,在Silverlight 2開始每個項目編譯后都會打包成為一個xap文件,如果我們要訪問當前xap文件中的UserControl比較容易,那我們如何訪問一個外部xap文件中的內容呢?甚至于如何訪問一個互聯(lián)網上的xap文件呢?

本文將簡單介紹一下在Silverlight中如何訪問外部xap文件。

需求

現(xiàn)在我們先來看一下需求,大致是這樣子的,在服務端我們有兩個xap文件,其中MainProject.xap文件將會在MainProjectTestPage.ASPx中引用,而ExternalProject.xap文件中的UserControl將會在MainProject.xap文件中訪問,并進行顯示,如下圖所示:

TerryLee_0107

現(xiàn)在我們來建立相關的項目,最終完成的項目結構如下圖所示:

TerryLee_0108 

這樣在編譯后,將會在ClientBin文件夾下產生兩個.xap文件,現(xiàn)在我們將在MainProject.xap文件中訪問ExternalProject.xap中的UserControl。

 

 

分析

在實現(xiàn)這個過程中,我們將會遇到兩個問題:

1.因為沒有任何頁面引用ExternalProject.xap文件,所以它不會下載到客戶端,這一點我們可以通過編碼的方式來下載它。

2.訪問ExternalProject.xap中的UserControl,我們需要找到對應的程序集,以便使用反射,我們知道在xap文件是一個標準的zip文件,它會包含相關的程序集(接下來我會寫一篇文章專門解釋xap文件),如下圖所示:

TerryLee_0109

現(xiàn)在解決了xap文件的下載已經程序集的訪問問題,我們可以著手來實現(xiàn)了。

實現(xiàn)

實現(xiàn)的過程也是相當簡單,首先我們使用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節(jié)點下包含了當前應用程序中所有的程序集。首先要根據下載的結果獲取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

 

 

注意它定義了一個很重要的屬性Parts,通過該屬性我們就可以訪問所有Deployment中的程序集。好了,現(xiàn)在我們看如何通過AppManifest.xaml中的內容構造Deployment對象,以及遍歷其中的程序集,如下代碼所示:

Deployment deployment = (Deployment)XamlReader.Load(appManifestString);Assembly assembly = null;foreach (AssemblyPart assemblyPart in deployment.Parts){    if (assemblyPart.Source == assemblyName)    {        String source = assemblyPart.Source;        StreamResourceInfo streamInfo = Application.GetResourceStream(            new StreamResourceInfo(packageStream,            "application/binary"),            new Uri(source,UriKind.Relative));        assembly = assemblyPart.Load(streamInfo.Stream);        break;    }}return assembly;

注意,在遍歷時如果我們找到程序集名等于我們想要訪問的程序集,則直接返回該程序集。最終完整的LoadAssemblyFromXap方法代碼如下:

Assembly LoadAssemblyFromXap(Stream packageStream,String assemblyName){    Stream stream = Application.GetResourceStream(            new StreamResourceInfo(packageStream, null),            new Uri("AppManifest.xaml", UriKind.Relative)).Stream;    String appManifestString = new StreamReader(stream).ReadToEnd();    Deployment deployment = (Deployment)XamlReader.Load(appManifestString);    Assembly assembly = null;    foreach (AssemblyPart assemblyPart in deployment.Parts)    {        if (assemblyPart.Source == assemblyName)        {            String source = assemblyPart.Source;            StreamResourceInfo streamInfo = Application.GetResourceStream(                new StreamResourceInfo(packageStream,                "application/binary"),                new Uri(source,UriKind.Relative));            assembly = assemblyPart.Load(streamInfo.Stream);            break;        }    }    return assembly;}

得到程序集后,再使用反射創(chuàng)建相關的實例,并在頁面上加載,如下代碼所示:

Assembly assembly = LoadAssemblyFromXap(e.Result, "ExternalProject.dll");UIElement element = assembly.CreateInstance("ExternalProject.SubPage") as UIElement;this.holder.Children.Add(element);

運行后效果如下圖所示:

TerryLee_0111 

跨域訪問

在上面的示例中,不涉及到跨域(我會專門寫一篇文章介紹)調用的問題,如果大家想訪問的xap文件與當前xap文件不在同一站點中,需要添加跨域訪問文件,如下代碼所示:

clientaccesspolicy.xml:

<?xml version="1.0" encoding="utf-8"?><access-policy>  <cross-domain-access>    <policy>      <allow-from http-request-headers="*" />      <domain uri="*"/>      </allow-from>      <grant-to>        <resource path="/" include-subpaths="true"/>      </grant-to>    </policy>  </cross-domain-access></access-policy>

總結

本文介紹了在Silverlight中如何訪問外部xap文件這一技巧,希望對大家有所幫助。示例代碼下載:

NET技術在Silverlight中如何訪問外部xap文件中UserControl,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 四川农村女人一级毛片 | 中文字幕在线观看91 | 韩国免费一级成人毛片 | 69堂国产成人精品视频不卡 | 免费看的www视频网站视频 | 精品中文字幕久久久久久 | 久久精品日本免费线 | 一级做a爰片久久毛片美女 一级做a爰片久久毛片人呢 | 国产视频一二三区 | 国产精品对白刺激 | 无遮挡一级毛片 | 91射射射| 婷婷夜夜躁天天躁人人躁 | 色中色官网| 黄色免费观看 | 青青草国产精品人人爱99 | 亚洲综合激情视频 | 亚洲一区二区免费 | 91精品视频网站 | 337p人体大胆扒开下部 | 美女大胸又爽又黄网站 | 国产中文字幕乱人伦在线观看 | 成人欧美视频免费看黄黄 | 色多多成视频人在线观看 | 国产手机精品视频 | 六月婷婷中文字幕 | 久久国产精品一区 | 91在线播放免费不卡无毒 | 奇米影视四色7777久久精品 | 国产极品在线观看视频 | 欧美高清在线视频 | 中文字幕精品一区 | 在线视频精品免费 | 亚洲黄色高清视频 | 国产成人午夜性a一级毛片 国产成人系列 | 亚洲精品成人中文网 | 国产精品特黄一级国产大片 | 成人免费在线视频观看 | 中文字幕专区在线亚洲 | 色在线影院 | 国产在线中文字幕 |