5

プラグインライブラリプロジェクトを1つにマージしようとしています(たとえば、Location + PhoneCallTask​​)。wp7で完全に動作しますが、monodroidで未処理の例外が発生します。

ファイルまたはアセンブリを読み込めませんでした'Cirrious.MvvmCross.Plugins.Location.Droid.dll'

もちろん、ロケーションプラグインは、マージされたライブラリである「Cirrious.MvvmCross.Plugins.Droid.dll」で参照されます。

マージされたライブラリパスを指す方法はありますか?

4

2 に答える 2

5

あなたの質問をより完全に検討しました...

マージプラグインが何であるかはまだ完全にはわかりませんが、他のすべてのプラットフォームがユーザーに明示的なファクトリメソッドを提供するように強制する一方で、MvvmCross-MonoDroidがファイル規則を使用してプラグインをロードする方法に問題があると思いますプラグインごとに。

この違いの理由は、ファイルの規則が(IMO)これを行うための最も優れた方法であるためです...しかし、他のすべてのプラットフォームでは、セキュリティやコンパイルの問題が発生するため、代替メカニズムを使用する必要がありました...

最も簡単な方法は、MonoDroidアプリのセットアップを切り替えて、ローダーの規則も使用することです。

これをする:

  • Setup.csで次のようにオーバーライドCreatePluginManager()します。

    protected override IMvxPluginManager CreatePluginManager()
    {
        var toReturn = new MvxLoaderBasedPluginManager();
        var registry = new MvxLoaderPluginRegistry(".Droid", toReturn.Loaders);
        AddPluginsLoaders(registry);
        return toReturn;
    }
    

次に、次のAddPluginsLoaders()ような実装を提供します。

    protected virtual void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
    {
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Visibility.Droid.Plugin>();
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Location.Droid.Plugin>();
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Phone.Droid.Plugin>();
        loaders.AddConventionalPlugin<AlphaPage.MvvmCross.Plugins.Mega.Droid.Plugin>();
        // etc
    }
于 2012-10-17T11:39:17.083 に答える
2

短い答え:

私はあなたがする必要があると推測しています:

  • 名前空間とアセンブリ名がすべて同じ規則であることを確認してください
  • UI.Droidプロジェクト内でコアプラグインアセンブリと正しいプラグイン実装の両方を参照していることを確認してください

より長い答え(私がすでに持っていたいくつかのメモに基づいて-すぐに公開されます):

まったく新しいプラグインを作成する場合は、次のようにします。

1.中央共有プラグインを作成します

これはポータブルクラスライブラリになります-たとえばAlphaPage.MvvmCross.Plugins.Mega

その中央の共有PCL内に、利用可能なポータブルコードを配置します。多くの場合、これは少数のサービスインターフェイス定義にすぎない可能性があります。

public interface IAlphaService { ... }

public interface IPageService { ... }

次に、そのプラグインのPluginManagerを追加します。これにより、次の定型文が追加されます。

public class PluginLoader
    : IMvxPluginLoader
    , IMvxServiceConsumer<IMvxPluginManager>
{
    public static readonly PluginLoader Instance = new PluginLoader();

    #region Implementation of IMvxPluginLoader

    public void EnsureLoaded()
    {
        var manager = this.GetService<IMvxPluginManager>();
        manager.EnsureLoaded<PluginLoader>();
    }

    #endregion
}

2.特定のプラグイン実装を作成します

次に、プラットフォームごとに、プラグインを実装します。たとえばAlphaPage.MvvmCross.Plugins.Mega.WindowsPhoneAlphaPage.MvvmCross.Plugins.Mega.Droid

これらのそれぞれの中で、サービスを提供するネイティブクラスを実装します。

public class MyAlphaService : IAlphaService { ... } 

public class MyPageService : IPageService { ... }

最後に、各プラグインは定型プラグインの実装を提供します。

public class Plugin
    : IMvxPlugin
    , IMvxServiceProducer
{
    #region Implementation of IMvxPlugin

    public void Load()
    {
        // alpha registered as a singleton
        this.RegisterServiceInstance<IAlphaService>(new MyAlphaService());
        // page registered as a type
        this.RegisterServiceType<IPageService, MyPageService>();
    }

    #endregion
}

3.プラグインのインスタンス化

各UIクライアントはプラグインを初期化する必要があります。

これは、エンドUIクライアントがライブラリ参照を以下に追加することによって行われます。

  • 共有コアプラグイン
  • 適切なプラグインの実装

3.1 WinRT、WindowsPhone、MonoTouch

次に、WinRT、WindowsPhone、MonoTouchクライアントの場合、setup.csでローダーアクセサーを提供する必要があります。

    protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
    {
        loaders.AddConventionalPlugin<AlphaPage.MvvmCross.Plugins.Mega.WindowsPhone.Plugin>();
        base.AddPluginsLoaders(loaders);
    }

ここでは規則が使用されていることに注意してください。したがって、AlphaPage.MvvmCross.Plugins.Mega.WindowsPhone.PluginがAlphaPage.MvvmCross.Plugins.Mega.PluginLoader用のWindowsPhoneプラグインを実装することが重要です。

3.2モノドロイド

MonoDroidクライアントの場合、MonoDroidには他のプラットフォームよりもAssembly.Loadの制限が少ないため、このセットアップ手順を追加する必要はありません。aoはファイルからプラグインをロードできます。ただし、これが機能するためには、アセンブリ名が一致していることが重要です。PluginLoaderが一致している場合、規則はAlphaPage.MvvmCross.Plugins.Mega.PluginLoaderプラグインをからロードしようとします。AlphaPage.MvvmCross.Plugins.Mega.Droid.dll

4.プラグインサービスの使用

このセットアップの後、アプリケーションは最終的に次の方法でプラグインにアクセスできるようになります。

  • 参照の追加共有コアポータブルライブラリ
  • いつか電話するAlphaPage.MvvmCross.Plugins.Mega.PluginLoader.Instance.EnsureLoaded()
  • this.GetService<IAlphaService>()次に、またはを使用して個々のサービスにアクセスしますthis.GetService<IPageService>()

5.純粋なポータブルプラグイン

一部のプラグインは「純粋なポータブル」にすることができます

この場合、プラットフォームごとに特殊化する必要はなく、ステップ3も必要ありません。

この例については、Jsonの実装を参照してください-https ://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/Json

于 2012-10-17T10:54:31.783 に答える