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

Должна ли загрузка модулей 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 );

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

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

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

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

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

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

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

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


person Bill    schedule 20.05.2010    source источник
comment
Мне также любопытно узнать этот ответ - я работаю OOB и мне нужно разделить свой проект ...   -  person Rodney    schedule 09.09.2010


Ответы (2)


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

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

Спасибо, Дамиан

person Damian Schenkelman    schedule 17.09.2010

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

person slipjig    schedule 06.01.2011