天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

在Silverlight中如何訪問(wèn)外部xap文件中UserControl

概述

眾所周知,在Silverlight 2開(kāi)始每個(gè)項(xiàng)目編譯后都會(huì)打包成為一個(gè)xap文件,如果我們要訪問(wèn)當(dāng)前xap文件中的UserControl比較容易,那我們?nèi)绾卧L問(wèn)一個(gè)外部xap文件中的內(nèi)容呢?甚至于如何訪問(wèn)一個(gè)互聯(lián)網(wǎng)上的xap文件呢?

本文將簡(jiǎn)單介紹一下在Silverlight中如何訪問(wèn)外部xap文件。

需求

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

TerryLee_0107

現(xiàn)在我們來(lái)建立相關(guān)的項(xiàng)目,最終完成的項(xiàng)目結(jié)構(gòu)如下圖所示:

TerryLee_0108 

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

 

 

分析

在實(shí)現(xiàn)這個(gè)過(guò)程中,我們將會(huì)遇到兩個(gè)問(wèn)題:

1.因?yàn)闆](méi)有任何頁(yè)面引用ExternalProject.xap文件,所以它不會(huì)下載到客戶端,這一點(diǎn)我們可以通過(guò)編碼的方式來(lái)下載它。

2.訪問(wèn)ExternalProject.xap中的UserControl,我們需要找到對(duì)應(yīng)的程序集,以便使用反射,我們知道在xap文件是一個(gè)標(biāo)準(zhǔn)的zip文件,它會(huì)包含相關(guān)的程序集(接下來(lái)我會(huì)寫(xiě)一篇文章專門(mén)解釋xap文件),如下圖所示:

TerryLee_0109

現(xiàn)在解決了xap文件的下載已經(jīng)程序集的訪問(wèn)問(wèn)題,我們可以著手來(lái)實(shí)現(xiàn)了。

實(shí)現(xiàn)

實(shí)現(xiàn)的過(guò)程也是相當(dāng)簡(jiǎ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){    // 得到下載結(jié)果}

這一步比較簡(jiǎn)單,接下來(lái)我們將根據(jù)下載的結(jié)果,得到相應(yīng)的程序集。我們知道在xap文件中的AppManifest.xaml文件相當(dāng)于一個(gè)清單,列出了當(dāng)前xap文件用到的程序集(下篇文章將會(huì)介紹),它的內(nèi)容如下所示:

<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é)點(diǎn)下包含了當(dāng)前應(yīng)用程序中所有的程序集。首先要根據(jù)下載的結(jié)果獲取AppManifest.xaml文件中的內(nèi)容,如下代碼所示:

Stream stream = Application.GetResourceStream(        new StreamResourceInfo(packageStream, null),        new Uri("AppManifest.xaml", UriKind.Relative)).Stream;String appManifestString = new StreamReader(stream).ReadToEnd();

有了AppManifest.xaml中內(nèi)容,就可以根據(jù)它來(lái)構(gòu)造一個(gè)Deployment對(duì)象,Deployment對(duì)象提供了當(dāng)前應(yīng)用程序的Part和本地化信息清單,它的定義如下所示:

TerryLee_0110

 

 

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

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;

注意,在遍歷時(shí)如果我們找到程序集名等于我們想要訪問(wèn)的程序集,則直接返回該程序集。最終完整的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)建相關(guān)的實(shí)例,并在頁(yè)面上加載,如下代碼所示:

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

運(yùn)行后效果如下圖所示:

TerryLee_0111 

跨域訪問(wèn)

在上面的示例中,不涉及到跨域(我會(huì)專門(mén)寫(xiě)一篇文章介紹)調(diào)用的問(wèn)題,如果大家想訪問(wèn)的xap文件與當(dāng)前xap文件不在同一站點(diǎn)中,需要添加跨域訪問(wèn)文件,如下代碼所示:

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>

總結(jié)

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

NET技術(shù)在Silverlight中如何訪問(wèn)外部xap文件中UserControl,轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 久久中文字幕亚洲精品最新 | 蜜芽无码亚洲资源网站 | 韩剧19禁啪啪无遮挡大尺度 | 亚洲国产精品嫩草影院久久 | 国产成人高清精品免费5388密 | 野花韩国中文版免费观看 | 精品久久久久中文字幕加勒比东京热 | 中文字幕久精品视频在线观看 | 秋霞特色大片18岁入口 | 中文字幕日本久久2019 | 青青草原伊人网 | 一个人免费完整观看日本 | 99视频全部看免费观 | 青草精品国产福利在线视频 | 男人J放进女人屁股免费观看 | 毛片内射久久久一区 | 芳草地在线观看免费观看 | 成人高清网站 | 麻豆传煤网站网址入口在线下载 | 在线自拍综合亚洲欧美 | 老牛天天晚上夜噜噜噜 | 国产AV视频一区二区蜜桃 | 一个人在线观看视频免费 | 一级做a爰片久久免费 | 乱码午夜-极品国产内射 | 99九九精品国产高清自在线 | 色欲AV人妻精品麻豆AV | 久久精品国产首叶 | 狠狠国产欧美在线视频 | 亚洲精品一本之道高清乱码 | 草莓视频app深夜福利 | 色狐直播免费观看 | 99在线在线视频观看 | 6080yy 久久 亚洲 日本 | 5G在线观看免费年龄确认18 | 动漫美女的阴 | 综合色就爱涩涩涩综合婷婷 | 午夜在线观看免费完整直播网页 | 久久亚洲精品2017 | 国产亚洲精品精品国产亚洲综合 | 综合精品欧美日韩国产在线 |