5

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に入力し、問題なくモジュールをダウンロードできます。

私はこれが実際に実行可能であるという言及を見つけることができませんでしたが、そうあるべきであるように思われます。このテーマで私が最も見つけたのは、Jeremy Likenessによるブログエントリです。これは、MEFでのモジュールのロードをカバーしていますが、ここで彼の知識を適用しても役に立ちませんでした。

サーバーはローカルホストです(これにより問題が発生する可能性があるとのことです)。サーバーにはclientaccesspolicy.xmlファイルがあります-それが必要だとは思いませんが。クライアントスタックを使用しており、アプリの構築中に登録します。

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

フォローアップの質問:

すべてのxapを何らかの方法でクライアントデスクトップにインストールできますか?それともメインアプリケーションのxapのみをインストールできますか?どういうわけかappmanifest.xmlでそれらを指定しますか?

application.xapのみがインストールされ、残りのxapをダウンロードする必要がある場合は、これを機能させる価値がありますか?

4

2 に答える 2

1

かつて私は同様のシナリオに取り組みました。秘訣は、モジュールを分離ストレージに格納し、オフラインで作業するときに分離ストレージから読み取るモジュール ローダーを使用することです。

そうしないと、シェルとは異なる .xap ファイルにあるモジュールをダウンロードできないためです。

ありがとう、ダミアン

于 2010-09-17T21:29:43.360 に答える
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);

出来上がり - これで、Prism がコードを呼び出してモジュールをロードします。

興味があれば、LocalFileDownloader クラスと、Web から .xap をロードするためにフォールバックするクラスを送信できます...ただし、Prism の FileDownloader クラスを見れば、それが単純であることがわかると思います。足りる。

他の質問に関しては、アプリがインストールされている URL が話している URL と同じである場合、または昇格された信頼関係にある場合、clientaccesspolicy.xml ファイルはおそらく必要ありません。

.xaps は間違いなくクライアントに事前にインストールできますが、少し手間がかかります。私たちが行ったことは、スタンドアロンの .NET 2.0 デスクトップ アプリであるランチャー アプリを作成することでした。メインの .xap と特定のモジュール* をダウンロードし (更新をチェックして、必要な場合のみダウンロードします)、必要に応じてアプリをアンインストール/再インストールしてから、アプリを起動します。最後の 2 つは、Silverlight の一部としてインストールされる sllauncher.exe を介して実行されます。これについての良い紹介があります: http://timheuer.com/blog/archive/2010/03/25/using-sllauncher-for-silent-install-silverlight-application.aspx .

昇格された信頼の下で実行していると仮定すると、SL クライアント内からモジュール .xaps をプリフェッチすることも可能ですが、ユーザーの操作によって実際に要求される前です。それらをどこかの My Documents の下のフォルダーに配置し、上記のカスタム モジュール ロード アプローチを使用してそこからそれらをプルするだけで済みます。

*私たちの場合、メインの .xap はアプリケーションの 2/3 です。残りの .xap は小さいので、サードパーティ コンポーネントのコンテナーとして作成した一部の .xap を除いて、オンザフライでダウンロードします。これらを頻繁に更新することは想定していないため、事前にインストールしています。

于 2011-01-06T14:54:21.377 に答える