2010-05-20 2 views
5

Должна ли загрузка модулей OnDemand Prism работать в режиме OOB? Если это так, я не могу заставить его работать. Все в настоящее время работает в браузере без каких-либо проблем. В частности, я: зарегистрировать свои модули в коде:Будет ли загружать модуль модуля Prism OnDemand в sceneio 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); 
    } 

позже запрос на модуль должен быть загружен сделан:

mModuleManager.LoadModule(ModuleNames.mod2); 

и ждать ответа на событие, опубликованную во время инициализации, что нагруженный модуль.

Модуль никогда не загружается, а при запуске приложения под отладчиком появится окно сообщения, в котором говорится, что веб-сервер вернул ошибку «не найден». Я могу взять запрашивающий url для модуля и ввести его в Firefox и загрузить модуль без проблем.

Я не смог найти ссылки на это, фактически будучи работоспособным, но кажется, что он должен. Самое большее, что я нашел по этому вопросу, - это blog entry by Jeremy Likeness, который охватывает модули загрузки в MEF, но использование его знаний здесь не помогло.

Сервер является localhost (я слышал, что он упоминал, что это может вызвать проблемы). У сервера есть файл clientaccesspolicy.xml - хотя я не ожидаю, что это необходимо. Я использую стек клиент и зарегистрировать его во время приложения строительства:

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

Followup вопросы:

Может все xaps быть установлен на рабочий стол клиента какой-то образом - или только основное приложение XAP? указать их в appmanifest.xml как-то ??

Стоит ли это делать, если установлен только application.xap, и остальная часть xaps должна быть загружена в любом случае?

+0

Мне также интересно узнать этот ответ - я работаю OOB и мне нужно разделить мой проект ... – Rodney

ответ

1

Как только я работал над подобным сценарием. Трюк состоит в том, что модули хранятся в изолированном хранилище и используют загрузчик модулей, который читает из изолированного хранилища при работе в автономном режиме.

Это связано с тем, что вы не можете загружать модули, которые находятся в другом .xap-файле, чем в Shell.

Спасибо, Damian

0

можно подключить пользовательский модуль грузчики в Prism, если вы готовы настроить источник Prism и построить его самостоятельно. Я действительно смог заставить это работать довольно легко - в нашем приложении я сначала смотрю на диск для модуля, и если он не найден, я возвращаюсь к загрузке его с сервера через сторонний коммерческий стек 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's FileDownloader, вы будете что это достаточно просто.

Что касается ваших других вопросов, файл clientaccesspolicy.xml, вероятно, не нужен, если URL-адрес, на котором установлено приложение, является тем же, с которым вы разговариваете, или если вы находитесь в повышенном доверии.

Возможно, на клиентском компьютере может быть установлена ​​предварительная установка, но это небольшая работа. Что мы сделали, так это написать приложение для запуска, которое представляет собой автономное настольное приложение .NET 2.0. Он загружает основной .xap плюс определенные модули * (проверяя обновления и загружая только по мере необходимости), затем удаляет/переустанавливает приложение, если это необходимо, а затем запускает приложение. Последние два выполняются через sllauncher.exe, который устанавливается как часть Silverlight. Вот хорошее введение к этому: http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx.

Предполагая, что вы работаете под повышенным доверием, также необходимо предварительно извлечь модули .xaps из клиента SL, но до того, как они действительно запрошены из-за действия пользователя. Вам просто нужно разместить их в папке в разделе «Мои документы» где-нибудь, а затем использовать описанный выше подход загрузки пользовательского модуля, чтобы вытащить их оттуда.

* В нашем случае наш основной .xap составляет 2/3 приложения. Остальные наши .xaps малы, поэтому мы загружаем их «на лету», за исключением некоторых .xaps, которые мы создали как контейнеры для сторонних компонентов. Мы не собираемся обновлять их очень часто, поэтому мы их предварительно устанавливаем.

Смежные вопросы