突破 Silverlight 自身限制, 做更好的動態加載導航機制(一)
Silverlight 對反射的限制
在 Silverlight 中, 對反射做了很多的限制, 最大的兩個限制是:
- 只能通過反射訪問 public 成員, 無法訪問其它 (private, protected, internal) 成員: 這一點,暫時沒有什么好的解決方案。
- 無法獲取程序集的引用信息: 這一點, 幸好有 Mono.Cecil , 可以通過 Mono.Cecil 繞過 Silverlight 對反射的限制, 獲取到程序及的引用信息。
Silverlight 對動態加載的限制
Silverlight 對動態加載的機制支持很差, 主要表現在:
- 沒有提供內置的動態加載程序集的方案, 需要開發者自己實現, 當然, 從服務端加載一個程序集很容易, 但是沒有好的辦法獲取到程序及的引用信息, 不能自動加載程序集引用的其它程序集;
- 不能將動態加載到的程序集添加到當前的 Silverlight 部署程序集緩存中 (Deployment.Current.Parts) 中, 需要開發者自己對已經加載的程序及做緩存;
- AppDomain.Current 不能添加動態加載的程序集信息。
Silverlight 內置導航機制的限制
Silverlight 內置了一種導航機制, 可以和瀏覽器導航欄無縫集成, 但是也有不少限制, 例如:
- 導航的地址必須是用戶控件 (UserControl) 或者頁面 (Page) 對應的 xaml 文件, 不能是其它的用戶控件;
- 由于 Silverlight 對反射以及動態加載的限制, 內置的導航機制不能自動加載動態加載的程序集中的控件;
不過,內置的導航可以通過實現 INavigationContentLoader 接口來完成, Frame 控件有一個 ContentLoader 屬性, 這個屬性的默認值是 PageResourceContentLoader 。
比較理想解決方案
比較理想的解決方案是, 將導航機制和動態加載程序集結合起來, 要實現的目標如下:
- Silverlight 程序集都不打包, 直接復制到 clientbin 目錄下, 當然, 主程序集還是要打包的, 否則客戶端 Silverlight 無法加載加載;
- 根據用戶的選擇, 從服務端按需加載對應程序集, 同時自動分析引用的程序集, 也自動從服務端加載;
- 擴展內置的導航機制, 使其能夠載入動態加載的程序集。
寫到這里, 相信有很多人對這個解決方案已經了解了, 甚至已經有了清晰地思路來實現了, 在下一篇博文中, 將貼出我的實現, 希望大家繼續關注。
張志敏所有文章遵循創作共用版權協議,要求署名、非商業 、保持一致。在滿足創作共用版權協議的基礎上可以轉載,但請以超鏈接形式注明出處。
本博客已經遷移到 GitHub , 圍觀地址: https://beginor.github.io/
浙公網安備 33010602011771號