2010-05-20 62 views
5

OnDemand Prism模塊的加載應該在OOB scenerio中工作嗎?如果是這樣,我似乎無法使其工作。一切正在瀏覽器中正常工作,沒有任何問題。具體地說I: 登記自己的模塊中的代碼:Prism OnDemand模塊加載在OOB scenerio中工作嗎?

protected override IModuleCatalog GetModuleCatalog() { 
     var catalog = new ModuleCatalog(); 
     Uri source; 

     if(Application.Current.IsRunningOutOfBrowser) { 
      source = IsolatedStorageSettings.ApplicationSettings[SOURCEURI] as Uri; 
     } 
     else { 
      var src = Application.Current.Host.Source.ToString(); 
      src = src.Substring(0, src.LastIndexOf('/') + 1); 
      source = new Uri(src); 
      IsolatedStorageSettings.ApplicationSettings[SOURCEURI] = source; 
      IsolatedStorageSettings.ApplicationSettings.Save(); 
     } 

     if(source != null) { 
      var mod2 = new ModuleInfo { InitializationMode = InitializationMode.OnDemand, 
          ModuleName = ModuleNames.mod2, 
          ModuleType = "mod2.Module, mod2.Directory, '1.0.0.0', Culture=neutral, PublicKeyToken=null"), 
          Ref = (new Uri(source, "mod2.xap")).AbsoluteUri }; 

      catalog.AddModule(mod2); 
     } 

// per Jeremy Likeness - did not help. 
     Application.Current.RootVisual = new Grid(); 

     return (catalog); 
    } 

用於待加載的模塊由後面的請求:

mModuleManager.LoadModule(ModuleNames.mod2); 

,並等待到該裝載的初始化過程中公佈的一個事件的響應模塊。

該模塊似乎永遠不會被加載,並且當應用程序在調試器下運行時,會出現一個消息框,指出Web服務器返回了「未找到」錯誤。我可以將該模塊的請求url並輸入到Firefox並下載模塊,沒有任何問題。

我一直沒有找到任何可以實際操作的參考,但它似乎應該如此。我在這個主題上找到的最多的是blog entry by Jeremy Likeness,它涵蓋了MEF中的加載模塊,但是在這裏應用他的知識並沒有幫助。

服務器是本地主機(我聽說它提到這可能會導致問題)。該服務器有一個clientaccesspolicy.xml文件 - 雖然我不指望這是必要的。 我使用的客戶端堆棧和註冊它應用在施工期間:

WebRequest.RegisterPrefix(Current.Host.Source.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped), WebRequestCreator.ClientHttp); 

後續問題:

可以將所有xaps的安裝以某種方式在客戶端桌面 - 或者只在主應用程序XAP?以某種方式在appmanifest.xml中指定它們?

如果只安裝了application.xap並且必須下載其餘的xaps,是否值得使用這個工作?

+0

我也很想知道這個答案 - 我正在OOB工作,需要分解我的項目... – Rodney 2010-09-09 00:47:24

回答

1

一旦我工作在類似的情況。訣竅是將模塊存儲在獨立存儲中,並使用模塊加載器在離線工作時從獨立存儲讀取數據。

這是因爲否則,您無法下載與Shell不同的.xap文件中的模塊。

感謝, 達米安

0

如果你願意來調整棱鏡源和建立它自己有可能鉤自定義模塊裝載機爲棱鏡。實際上,我可以很容易地實現這一點 - 在我們的應用程序中,我首先查看模塊中的磁盤,如果找不到,我會回到從服務器通過支持第三方商業HTTP堆棧的方式加載它,客戶證書。

爲此,請下載Prism源代碼,並找到Microsoft.Practices.Composite.Modularity.XapModuleTypeLoader類。該類使用另一個Prism類Microsoft.Practices.Composite.Modularity.FileDownloader來下載.xap內容;但它直接實例化,讓你沒有機會注入你自己的或任何東西。

所以 - 在XapModuleTypeLoader,我添加了一個靜態屬性來設置下載的類型:

public static Type DownloaderType { get; set; } 

然後我修改CreateDownloader()方法來使用上述類型優先於默認之一:

protected virtual IFileDownloader CreateDownloader() { 
    if (_downloader == null) { 
     if (DownloaderType == null) { 
      _downloader = new FileDownloader(); 
     } else { 
      _downloader = (IFileDownloader)Activator.CreateInstance(DownloaderType); 
     } 
    } 

    return _downloader; 
} 

當我的應用程序啓動時,我的屬性設置爲我自己下載類型:

XapModuleTypeLoader.DownloaderType = typeof(LocalFileDownloader); 

Voila - 現在Prism調用你的代碼來加載它的模塊。

我可以給你發送我的LocalFileDownloader類以及它回退的類,如果你感興趣的話,從網絡載入.xap ...我懷疑如果你看Prism的FileDownloader類,你會看到它很簡單。

關於您的其他問題,如果安裝該應用程序的URL與您正在交談的URL相同,或者您處於提升信任狀態,則可能不需要clientaccesspolicy.xml文件。

.xaps絕對可以預先安裝在客戶端上,但這是一項工作。我們所做的是編寫一個獨立的.NET 2.0桌面應用程序的啓動器應用程序。它下載主要的.xap加上某些模塊*(根據需要檢查更新和下載),然後根據需要卸載/重新安裝應用程序,然後啓動應用程序。最後兩個是通過sllauncher.exe完成的,它是作爲Silverlight的一部分安裝的。這是一個很好的介紹:http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx

假設您在提升的信任下運行,還應該可以從SL客戶端中預取模塊.xaps,但在用戶操作之前實際請求它們之前。您只需將它們放在我的文檔某處的文件夾中,然後使用上述自定義模塊加載方法將它們從那裏拉出即可。

*在我們的例子中,我們的主要.xap是應用程序的2/3。我們的.xaps其餘部分很小,因此我們隨即下載它們,除了我們爲第三方組件創建的一些.xaps外。我們不希望經常更新這些內容,所以我們會預先安裝它們。

相關問題