轉(zhuǎn)帖|其它|編輯:郝浩|2011-09-22 14:40:08.000|閱讀 474 次
概述:在Silverlight 2開始每個項目編譯后都會打包成為一個xap文件,如果我們要訪問當前xap文件中的UserControl比較容易,那我們?nèi)绾卧L問一個外部xap文件中的內(nèi)容呢?甚至于如何訪問一個互聯(lián)網(wǎng)上的xap文件呢?
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
眾所周知,在Silverlight 2開始每個項目編譯后都會打包成為一個xap文件,如果我們要訪問當前xap文件中的UserControl比較容易,那我們?nèi)绾卧L問一個外部xap文件中的內(nèi)容呢?甚至于如何訪問一個互聯(lián)網(wǎng)上的xap文件呢?
本文將簡單介紹一下在Silverlight中如何訪問外部xap文件。
現(xiàn)在我們先來看一下需求,大致是這樣子的,在服務端我們有兩個xap文件,其中MainProject.xap文件將會在 MainProjectTestPage.aspx中引用,而ExternalProject.xap文件中的UserControl將會在 MainProject.xap文件中訪問,并進行顯示,如下圖所示:
現(xiàn)在我們來建立相關(guān)的項目,最終完成的項目結(jié)構(gòu)如下圖所示:
這樣在編譯后,將會在ClientBin文件夾下產(chǎn)生兩個.xap文件,現(xiàn)在我們將在MainProject.xap文件中訪問ExternalProject.xap中的UserControl。
在實現(xiàn)這個過程中,我們將會遇到兩個問題:
1.因為沒有任何頁面引用ExternalProject.xap文件,所以它不會下載到客戶端,這一點我們可以通過編碼的方式來下載它。
2.訪問ExternalProject.xap中的UserControl,我們需要找到對應的程序集,以便使用反射,我們知道在xap文件是一個標準的zip文件,它會包含相關(guān)的程序集(接下來我會寫一篇文章專門解釋xap文件),如下圖所示:
現(xiàn)在解決了xap文件的下載已經(jīng)程序集的訪問問題,我們可以著手來實現(xiàn)了。
實現(xiàn)的過程也是相當簡單,首先我們使用WebClient去下載xap文件,相信大家都知道該怎么做了,如下代碼所示
v?o?i?d? m?y?B?u?t?t?o?n?_?C?l?i?c?k?(o?b?j?e?c?t? s?e?n?d?e?r?,? R?o?u?t?e?d?E?v?e?n?t?A?r?g?s? e?)? ?{? ? ? ? ? U?r?i? a?d?d?r?e?s?s? ?=? n?e?w? U?r?i("?h?t?t?p?:?/?/?l?o?c?a?l?h?o?s?t?:?4?1?6?1?/?C?l?i?e?n?t?B?i?n?/?E?x?t?e?r?n?a?l?P?r?o?j?e?c?t?.?x?a?p?")?;? ? ? ? ? W?e?b?C?l?i?e?n?t? w?e?b?C?l?i?e?n?t? ?=? n?e?w? W?e?b?C?l?i?e?n?t(?)?;? ? ? ? ? ?w?e?b?C?l?i?e?n?t?.?O?p?e?n?R?e?a?d?C?o?m?p?l?e?t?e?d? ?+?=? ? ? ? ? ? ? ? n?e?w? O?p?e?n?R?e?a?d?C?o?m?p?l?e?t?e?d?E?v?e?n?t?H?a?n?d?l?e?r (?w?e?b?C?l?i?e?n?t?_?O?p?e?n?R?e?a?d?C?o?m?p?l?e?t?e?d?)?;? ? ? ? ?w?e?b?C?l?i?e?n?t?.?O?p?e?n?R?e?a?d?A?s?y?n?c?(?a?d?d?r?e?s?s?)?;? ?}? ? v?o?i?d? w?e?b?C?l?i?e?n?t?_?O?p?e?n?R?e?a?d?C?o?m?p?l?e?t?e?d? (o?b?j?e?c?t? s?e?n?d?e?r?,? O?p?e?n?R?e?a?d?C?o?m?p?l?e?t?e?d?E?v?e?n?t?A?r?g?s? e?)? ?{? ? ? ? ? /?/? ? 得?到?下?載?結(jié)?果? }
這一步比較簡單,接下來我們將根據(jù)下載的結(jié)果,得到相應的程序集。我們知道在xap文件中的AppManifest.xaml文件相當于一個清單,列出了當前xap文件用到的程序集(下篇文章將會介紹),它的內(nèi)容如下所示:
<D?e?p?l?o?y?m?e?n?t? x?m?l?n?s="h?t?t?p?:?/?/?s?c?h?e?m?a?s?.?m?i?c?r?o?s?o?f?t?.?c?o?m?/?c?l?i?e?n?t?/?2?0?0?7?/?d?e?p?l?o?y?m?e?n?t"? ? ? ? ? ? ? ? ? ? ? ? ? x?m?l?n?s?:?x="h?t?t?p?:?/?/?s?c?h?e?m?a?s?.?m?i?c?r?o?s?o?f?t?.?c?o?m?/?w?i?n?f?x?/?2?0?0?6?/?x?a?m?l"? ? ? ? ? ? ? ? ? ? ? ? ? ? E?n?t?r?y?P?o?i?n?t?A?s?s?e?m?b?l?y="E?x?t?e?r?n?a?l?P?r?o?j?e?c?t"? ? ? ? ? ? ? ? ? ? ? ? ? ? E?n?t?r?y?P?o?i?n?t?T?y?p?e="E?x?t?e?r?n?a?l?P?r?o?j?e?c?t?.?A?p?p"? ? ? ? ? ? ? ? ? ? ? ? ? ? R?u?n?t?i?m?e?V?e?r?s?i?o?n="2?.?0?.?3?0?5?2?3?.?6">? ? ? ?<D?e?p?l?o?y?m?e?n?t?.?P?a?r?t?s>? ? ? ? ?<A?s?s?e?m?b?l?y?P?a?r?t? x?:?N?a?m?e="E?x?t?e?r?n?a?l?P?r?o?j?e?c?t"? S?o?u?r?c?e="E?x?t?e?r?n?a?l?P?r?o?j?e?c?t?.?d?l?l"? /?>? ? ? ?<?/D?e?p?l?o?y?m?e?n?t?.?P?a?r?t?s>? ?<?/D?e?p?l?o?y?m?e?n?t>
注意,在Deployment.Parts節(jié)點下包含了當前應用程序中所有的程序集。首先要根據(jù)下載的結(jié)果獲取AppManifest.xaml文件中的內(nèi)容,如下代碼所示:
S?t?r?e?a?m? s?t?r?e?a?m? ?=? A?p?p?l?i?c?a?t?i?o?n.?G?e?t?R?e?s?o?u?r?c?e?S?t?r?e?a?m?(? ? ? ? ? ? ? ? ? n?e?w? S?t?r?e?a?m?R?e?s?o?u?r?c?e?I?n?f?o(?p?a?c?k?a?g?e?S?t?r?e?a?m?,? n?u?l?l)?,? ? ? ? ? ? ? ? ? n?e?w? U?r?i("?A?p?p?M?a?n?i?f?e?s?t?.?x?a?m?l?",? U?r?i?K?i?n?d.?R?e?l?a?t?i?v?e?)?)?.?S?t?r?e?a?m?;? ? S?t?r?i?n?g? a?p?p?M?a?n?i?f?e?s?t?S?t?r?i?n?g? ?=? n?e?w? S?t?r?e?a?m?R?e?a?d?e?r(?s?t?r?e?a?m?)?.?R?e?a?d?T?o?E?n?d?(?)?;
有了AppManifest.xaml中內(nèi)容,就可以根據(jù)它來構(gòu)造一個Deployment對象,Deployment對象提供了當前應用程序的Part和本地化信息清單,它的定義如下所示:
注意它定義了一個很重要的屬性Parts,通過該屬性我們就可以訪問所有Deployment中的程序集。好了,現(xiàn)在我們看如何通過AppManifest.xaml中的內(nèi)容構(gòu)造Deployment對象,以及遍歷其中的程序集,如下代碼所示:
D?e?p?l?o?y?m?e?n?t? d?e?p?l?o?y?m?e?n?t? ?=? ? (D?e?p?l?o?y?m?e?n?t)X?a?m?l?R?e?a?d?e?r.?L?o?a?d?(?a?p?p?M?a?n?i?f?e?s?t?S?t?r?i?n?g?)?;? ? A?s?s?e?m?b?l?y? a?s?s?e?m?b?l?y? ?=? n?u?l?l;? f?o?r?e?a?c?h? (A?s?s?e?m?b?l?y?P?a?r?t? a?s?s?e?m?b?l?y?P?a?r?t? i?n? d?e?p?l?o?y?m?e?n?t?.?P?a?r?t?s?)? ?{? ? ? ? ? i?f? (?a?s?s?e?m?b?l?y?P?a?r?t?.?S?o?u?r?c?e? ?=?=? ?a?s?s?e?m?b?l?y?N?a?m?e?)? ? ? ? ? ?{? ? ? ? ? ? ? ? ? S?t?r?i?n?g? s?o?u?r?c?e? ?=? ?a?s?s?e?m?b?l?y?P?a?r?t?.?S?o?u?r?c?e?;? ? ? ? ? ?S?t?r?e?a?m?R?e?s?o?u?r?c?e?I?n?f?o? s?t?r?e?a?m?I?n?f?o? ?=? A?p?p?l?i?c?a?t?i?o?n.?G?e?t?R?e?s?o?u?r?c?e?S?t?r?e?a?m?(? ? ? ? ? n?e?w? S?t?r?e?a?m?R?e?s?o?u?r?c?e?I?n?f?o(?p?a?c?k?a?g?e?S?t?r?e?a?m?,? ? ? ? ? ? ? ? ? ? ? ? ? "?a?p?p?l?i?c?a?t?i?o?n?/?b?i?n?a?r?y?")?,? ? ? ? ? ? ? ? ? ? ? ? ? n?e?w? U?r?i(?s?o?u?r?c?e?,U?r?i?K?i?n?d.?R?e?l?a?t?i?v?e?)?)?;? ? ? ? ? ? ? ? ? ? ?a?s?s?e?m?b?l?y? ?=? ?a?s?s?e?m?b?l?y?P?a?r?t?.?L?o?a?d?(?s?t?r?e?a?m?I?n?f?o?.?S?t?r?e?a?m?)?;? ? ? ? ? ? ? ? ? b?r?e?a?k;? ? ? ? ? ?}? ?}? r?e?t?u?r?n? a?s?s?e?m?b?l?y?;
注意,在遍歷時如果我們找到程序集名等于我們想要訪問的程序集,則直接返回該程序集。最終完整的LoadAssemblyFromXap方法代碼如下:
A?s?s?e?m?b?l?y? L?o?a?d?A?s?s?e?m?b?l?y?F?r?o?m?X?a?p? (S?t?r?e?a?m? p?a?c?k?a?g?e?S?t?r?e?a?m?,S?t?r?i?n?g? a?s?s?e?m?b?l?y?N?a?m?e?)? ?{? ? ? ? ? S?t?r?e?a?m? s?t?r?e?a?m? ?=? A?p?p?l?i?c?a?t?i?o?n.?G?e?t?R?e?s?o?u?r?c?e?S?t?r?e?a?m?(? ? ? ? ? ? ? ? ? ? ? ? ? n?e?w? S?t?r?e?a?m?R?e?s?o?u?r?c?e?I?n?f?o(?p?a?c?k?a?g?e?S?t?r?e?a?m?,? n?u?l?l)?,? ? ? ? ? ? ? ? ? ? ? ? ? n?e?w? U?r?i("?A?p?p?M?a?n?i?f?e?s?t?.?x?a?m?l?",? U?r?i?K?i?n?d.?R?e?l?a?t?i?v?e?)?)?.?S?t?r?e?a?m?;? ? ? ? ? ? S?t?r?i?n?g? a?p?p?M?a?n?i?f?e?s?t?S?t?r?i?n?g? ?=? n?e?w? S?t?r?e?a?m?R?e?a?d?e?r(?s?t?r?e?a?m?)?.?R?e?a?d?T?o?E?n?d?(?)?;? ? ? ? ? ? D?e?p?l?o?y?m?e?n?t? d?e?p?l?o?y?m?e?n?t? ?=? ?(D?e?p?l?o?y?m?e?n?t)X?a?m?l?R?e?a?d?e?r.?L?o?a?d?(?a?p?p?M?a?n?i?f?e?s?t?S?t?r?i?n?g?)?;? ? ? ? ? ? A?s?s?e?m?b?l?y? a?s?s?e?m?b?l?y? ?=? n?u?l?l;? ? ? ? ? f?o?r?e?a?c?h? (A?s?s?e?m?b?l?y?P?a?r?t? a?s?s?e?m?b?l?y?P?a?r?t? i?n? d?e?p?l?o?y?m?e?n?t?.?P?a?r?t?s?)? ? ? ? ? ?{? ? ? ? ? ? ? ? ? i?f? (?a?s?s?e?m?b?l?y?P?a?r?t?.?S?o?u?r?c?e? ?=?=? ?a?s?s?e?m?b?l?y?N?a?m?e?)? ? ? ? ? ? ? ? ? ?{? ? ? ? ? ? ? ? ? ? ? ? ? S?t?r?i?n?g? s?o?u?r?c?e? ?=? ?a?s?s?e?m?b?l?y?P?a?r?t?.?S?o?u?r?c?e?;? ? ? ? ? ? ? ? ? ? ? ? ? ? S?t?r?e?a?m?R?e?s?o?u?r?c?e?I?n?f?o? s?t?r?e?a?m?I?n?f?o? ?=? A?p?p?l?i?c?a?t?i?o?n.?G?e?t?R?e?s?o?u?r?c?e?S?t?r?e?a?m?(? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? n?e?w? S?t?r?e?a?m?R?e?s?o?u?r?c?e?I?n?f?o(?p?a?c?k?a?g?e?S?t?r?e?a?m?,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "?a?p?p?l?i?c?a?t?i?o?n?/?b?i?n?a?r?y?")?,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? n?e?w? U?r?i(?s?o?u?r?c?e?,U?r?i?K?i?n?d.?R?e?l?a?t?i?v?e?)?)?;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?a?s?s?e?m?b?l?y? ?=? ?a?s?s?e?m?b?l?y?P?a?r?t?.?L?o?a?d?(?s?t?r?e?a?m?I?n?f?o?.?S?t?r?e?a?m?)?;? ? ? ? ? ? ? ? ? ? ? ? ? b?r?e?a?k;? ? ? ? ? ? ? ? ? ?}? ? ? ? ? ?}? ? ? ? ? r?e?t?u?r?n? a?s?s?e?m?b?l?y?;? ?}
得到程序集后,再使用反射創(chuàng)建相關(guān)的實例,并在頁面上加載,如下代碼所示:
Assembly assembly = LoadAssemblyFromXap(e.Result, "ExternalProject.dll"); UIElement element = assembly.CreateInstance("ExternalProject.SubPage") as UIElement; this.holder.Children.Add(element);
運行后效果如下圖所示:
在上面的示例中,不涉及到跨域(我會專門寫一篇文章介紹)調(diào)用的問題,如果大家想訪問的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文件這一技巧,希望對大家有所幫助。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡轉(zhuǎn)載