【问题标题】:Will Prism OnDemand module loading work in an OOB scenerio?Prism OnDemand 模块加载能否在 OOB 场景中工作?
【发布时间】:2011-02-21 22:32:05
【问题描述】:

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

并等待对该加载模块初始化期间发布的事件的响应。

该模块似乎从未被加载,当应用程序在调试器下运行时,将出现一个消息框,指出 Web 服务器返回“未找到”错误。我可以获取模块的请求 url 并将其输入到 Firefox 并毫无问题地下载模块。

我还没有找到任何关于这实际上可行的参考,但它似乎应该这样做。我在这个主题上找到的最多的是blog entry by Jeremy Likeness,它涵盖了在 MEF 中加载模块,但在这里应用他的知识并没有帮助。

服务器是本地主机(我听说它提到这可能会导致问题)。服务器有一个 clientaccesspolicy.xml 文件——虽然我不认为这是需要的。 我正在使用客户端堆栈并在应用构建期间对其进行注册:

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

后续问题:

能否以某种方式将所有 xap 安装到客户端桌面 - 还是仅安装主应用程序 xap?以某种方式在 appmanifest.xml 中指定它们??

如果只安装了 application.xap 并且必须下载其余的 xap,这样做是否值得?

【问题讨论】:

  • 我也很想知道这个答案 - 我正在 OOB 工作,需要拆分我的项目...

标签: silverlight prism ondemand silverlight-oob


【解决方案1】:

曾经我处理过类似的场景。诀窍是将模块存储在隔离存储中,并使用模块加载器在离线工作时从隔离存储中读取。

这是因为否则,您将无法下载与 Shell 不同的 .xap 文件中的模块。

谢谢, 达米安

【讨论】:

    【解决方案2】:

    如果您愿意调整 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 的类...我怀疑如果您查看 Prism 的 FileDownloader 类,您会看到这很简单。

    关于您的其他问题,如果安装应用的 URL 与您正在交谈的 URL 相同,或者您的信任度较高,则可能不需要 clientaccesspolicy.xml 文件。

    .xaps 绝对可以预先安装在客户端上,但这有点麻烦。我们所做的是编写一个启动器应用程序,它是一个独立的 .NET 2.0 桌面应用程序。它下载主 .xap 和某些模块*(检查更新并仅在需要时下载),然后在必要时卸载/重新安装应用程序,然后启动应用程序。最后两个是通过作为 Silverlight 的一部分安装的 sllauncher.exe 完成的。这是一个很好的介绍:http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx

    假设您在提升的信任下运行,也应该可以从 SL 客户端中预取模块 .xaps,但在用户操作实际请求它们之前。您只需要将它们放在“我的文档”下的某个文件夹中,然后使用上述自定义模块加载方法从那里拉取它们。

    *在我们的例子中,我们的主 .xap 是应用程序的 2/3。我们的 .xap 的其余部分都很小,因此我们会即时下载它们,但我们创建的一些 .xap 作为第三方组件的容器除外。我们不希望经常更新这些内容,因此我们预先安装了它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多