Будет ли загрузка модуля Prism OnDemand работать в сценарии OOB? - PullRequest
5 голосов
/ 20 мая 2010

Должна ли загрузка модулей OnDemand Prism работать в сценарии 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 );

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

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

Мне не удалось найти какой-либо ссылки на то, что это действительно выполнимо, но кажется, что так и должно быть. Максимум, что я нашел по этому вопросу, - это запись в блоге Джереми Ликенесса , которая описывает загрузку модулей в MEF, но применение его знаний здесь не помогло.

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

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

Последующие вопросы:

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

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

Ответы [ 2 ]

1 голос
/ 18 сентября 2010

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

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

Спасибо, Damian

0 голосов
/ 06 января 2011

Можно подключить пользовательские загрузчики модулей в 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);

Вуаля - теперь Prism вызывает ваш код для загрузки своих модулей.

Я могу отправить вам мой класс LocalFileDownloader, а также класс, к которому он прибегает для загрузки .xap из Интернета, если вы 'интересно ... хотя я подозреваю, что если вы посмотрите на класс FileDownloader Prism, то увидите, что он достаточно прост.

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

.xaps может быть предварительно установлен наклиент, но это немного работы.Мы разработали приложение для запуска, которое представляет собой отдельное настольное приложение .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, которые мы создали в качестве контейнеров для сторонних компонентов.Мы не ожидаем, что они будут обновляться очень часто, поэтому мы их предварительно устанавливаем.

...