2010-05-20 12 views
5

Việc tải các mô-đun OnDemand Prism có hoạt động trong bộ quét OOB không? Nếu vậy, tôi dường như không thể làm cho nó hoạt động được. Tất cả mọi thứ hiện đang làm việc trong trình duyệt mà không có bất kỳ vấn đề. Cụ thể là tôi: đăng ký module của tôi trong mã:Sẽ Prism OnDemand mô-đun tải công việc trong một scotio OOB?

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); 
    } 

yêu cầu sau cho các mô-đun được nạp được thực hiện:

mModuleManager.LoadModule(ModuleNames.mod2); 

và chờ đợi một phản ứng với một sự kiện được công bố trong thời gian khởi tạo đó được nạp mô-đun.

Mô-đun này dường như không bao giờ được tải và khi ứng dụng đang chạy trong trình gỡ lỗi, sẽ có hộp thông báo cho biết máy chủ web trả lại lỗi 'không tìm thấy'. Tôi có thể lấy url yêu cầu cho mô-đun và nhập nó vào Firefox và tải xuống mô-đun mà không có vấn đề gì.

Tôi chưa thể tìm thấy bất kỳ tham chiếu nào đến điều này thực sự có thể thực hiện được, nhưng có vẻ như nó phải như vậy. Phần lớn nhất tôi tìm thấy về chủ đề là blog entry by Jeremy Likeness, bao gồm các mô-đun tải trong MEF, nhưng việc áp dụng kiến ​​thức của mình ở đây không có tác dụng.

Máy chủ là máy chủ cục bộ (Tôi đã nghe nói rằng điều này có thể gây ra sự cố). Máy chủ có tệp clientaccesspolicy.xml - mặc dù tôi không mong đợi điều đó là cần thiết. Tôi đang sử dụng ngăn xếp client và đăng ký nó trong quá trình thi ứng dụng:

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

câu hỏi followup:

tất cả các xaps có thể được cài đặt vào máy tính để bàn của khách hàng trong một số cách - hoặc chỉ XAP ứng dụng chính? chỉ định chúng trong appmanifest.xml bằng cách nào đó ??

Có đáng để thực hiện tác vụ này nếu chỉ ứng dụng.x.x được cài đặt và phần còn lại của các xaps phải được tải xuống không?

+0

Tôi cũng tò mò muốn biết câu trả lời này - Tôi đang làm việc OOB và cần chia nhỏ dự án của mình ... – Rodney

Trả lời

1

Khi tôi đã làm việc trên một kịch bản tương tự. Bí quyết là có các mô-đun được lưu trữ trong bộ nhớ bị cô lập và sử dụng bộ nạp mô-đun đọc từ bộ nhớ bị cô lập khi làm việc ngoại tuyến.

Điều này là do nếu không, bạn không thể tải xuống các mô-đun nằm trong tệp .xap khác với tệp Shell.

Cảm ơn, Damian

0

Có thể treo bộ tải mô-đun tùy chỉnh vào Prism nếu bạn sẵn sàng để tinh chỉnh các nguồn Prism và xây dựng nó cho mình. Tôi đã thực sự có thể làm việc này khá dễ dàng - trong ứng dụng của chúng tôi, tôi nhìn vào đĩa đầu tiên cho mô-đun và nếu không tìm thấy nó, tôi sẽ quay lại để tải nó từ máy chủ thông qua ngăn xếp HTTP thương mại của bên thứ ba hỗ trợ chứng chỉ ứng dụng khách.

Để thực hiện việc này, hãy tải xuống mã nguồn Prism và định vị lớp Microsoft.Practices.Composite.Modularity.XapModuleTypeLoader. Lớp này sử dụng một lớp Prism khác, Microsoft.Practices.Composite.Modularity.FileDownloader, để tải xuống nội dung .xap; nhưng nó ngay lập tức nó trực tiếp, cho bạn không có cơ hội để tiêm của riêng bạn hoặc bất cứ điều gì.

Vì vậy - trong XapModuleTypeLoader, tôi đã thêm một thuộc tính tĩnh để thiết lập các loại downloader:

public static Type DownloaderType { get; set; } 

Sau đó, tôi đổi phương pháp CreateDownloader() để sử dụng các loại đã nêu ở trên trong ưu tiên cho một mặc định:

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

    return _downloader; 
} 

Khi ứng dụng của tôi bắt đầu lên, tôi thiết lập thuộc tính để loại downloader của riêng tôi:

XapModuleTypeLoader.DownloaderType = typeof(LocalFileDownloader); 

Voila - bây giờ Prism gọi mã của bạn để tải các mô-đun của nó.

Tôi có thể gửi cho bạn lớp LocalFileDownloader của tôi cũng như lớp mà nó rơi xuống để tải .xap từ web nếu bạn quan tâm ... Tôi nghi ngờ rằng nếu bạn nhìn vào lớp FileDownloader của Prism bạn sẽ thấy rằng nó đủ đơn giản.

Đối với các câu hỏi khác của bạn, tệp clientaccesspolicy.xml có thể không cần thiết nếu URL ứng dụng được cài đặt bên dưới giống với ứng dụng bạn đang nói đến hoặc nếu bạn đang ở mức tin tưởng cao.

Các ảnh chụp có thể được cài đặt sẵn trên máy khách, nhưng đó là một chút công việc. Những gì chúng tôi đã làm là viết một ứng dụng launcher là một ứng dụng desktop .NET 2.0 độc lập. Nó tải xuống .xap chính cộng với một số mô-đun * (kiểm tra các bản cập nhật và tải xuống chỉ khi cần), sau đó gỡ cài đặt/cài đặt lại ứng dụng nếu cần, sau đó khởi chạy ứng dụng. Hai cái cuối cùng được thực hiện thông qua sllauncher.exe, được cài đặt như một phần của Silverlight. Dưới đây là phần giới thiệu tốt cho điều đó: http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx.

Giả sử bạn đang chạy dưới sự tin cậy nâng cao, bạn cũng có thể tìm nạp trước mô-đun .xaps từ trong ứng dụng khách SL nhưng trước khi chúng thực sự được yêu cầu do hành động của người dùng. Bạn chỉ cần đặt chúng trong một thư mục trong My Documents ở đâu đó, và sau đó sử dụng phương pháp tải mô-đun tùy chỉnh được mô tả ở trên để kéo chúng từ đó.

* Trong trường hợp của chúng tôi, tệp .xap chính của chúng tôi là 2/3 của ứng dụng. Phần còn lại của các tệp .xaps của chúng tôi nhỏ, vì vậy chúng tôi tải xuống chúng một cách nhanh chóng, ngoại trừ một số .xaps chúng tôi đã tạo làm vùng chứa cho các thành phần của bên thứ ba. Chúng tôi không mong đợi để cập nhật những người rất thường xuyên, vì vậy chúng tôi cài đặt sẵn chúng.

Các vấn đề liên quan