1

我已经使用 MvvmCross v1 有一段时间了,我发现它真的很有用而且不太难使用!所以我硬着头皮决定在我们的下一个项目中使用 vnext。在我尝试使用插件之前一切都很好,它崩溃并显示以下输出 -

2013-03-21 18:14:27.121 MyApp[85942:11903] mvx: Diagnostic:   0,00 Setup: Text serialization start
2013-03-21 18:14:27.124 MyApp[85942:11903] mvx: Diagnostic:   0,03 Setup: PlatformServices start
2013-03-21 18:14:27.125 MyApp[85942:11903] mvx: Diagnostic:   0,03 Setup: ViewModelFramework start
2013-03-21 18:14:27.126 MyApp[85942:11903] mvx: Diagnostic:   0,03 Setup: PluginManagerFramework start
2013-03-21 18:14:27.127 MyApp[85942:11903] mvx: Diagnostic:   0,03 Setup: App start

Unhandled Exception:
0   MyApp                      0x00079b12 mono_handle_exception_internal_first_pass + 3058
1   MyApp                      0x0007b1e2 mono_handle_exception_internal + 1602
2   MyApp                      0x0007bd2f mono_handle_exception + 47
3   MyApp                      0x000bce22 mono_x86_throw_exception + 306
4   ???                                 0x07986f8f 0x0 + 127430543
at Cirrious.MvvmCross.Plugins.MvxBasePluginManager.ExceptionWrappedLoadPlugin (System.Type) <IL 0x00002, 0x0001f>
at Cirrious.MvvmCross.Plugins.MvxBasePluginManager.EnsureLoaded<T> () <IL 0x00030, 0x0008c>
at Cirrious.MvvmCross.Plugins.Share.PluginLoader.EnsureLoaded () <IL 0x00008, 0x00029>
at MyApp.Core.BaseApp.InitialisePlugins () [0x00000] in /Users/franklyn/Documents/Programming/MyApp/MyApp.Core/App.cs:42

每当我尝试加载具有“Touch”项目元素的插件时,都会发生这种情况,而其他插件(例如没有的 JsonLocalisation 插件)加载正常。

如果其他人遇到此问题并知道解决方法,我会很高兴收到他们的来信。

4

1 回答 1

2

对于 Android,插件被加载只是因为它们在那里——它们是文件并且可以通过Assembly.Load

对于 iOS,由于 Ahead-Of-Time 编译要求,无法以这种方式加载插件。

为了解决这个问题,iOS 中的所有平台特定插件都必须在设置期间进行注册。

AddPluginLoaders您可以在Setup所有示例中看到此代码- 请参阅https://github.com/slodge/MvvmCross/blob/vnext/Sample%20-%20TwitterSearch/TwitterSearch.UI.Touch/Setup.cs

protected override void AddPluginsLoaders(MvxLoaderPluginRegistry registry)
{
    registry.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Visibility.Touch.Plugin>();
    registry.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.File.Touch.Plugin>();
    registry.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.DownloadCache.Touch.Plugin>();
    base.AddPluginsLoaders(registry);
}

总的来说,插件机制比旧v1代码要好得多,因为这意味着你的应用程序中包含的不需要的代码更少,而且它是可扩展的。


有关为什么Assembly.Load不能在 iOS 中使用的最近讨论,请参阅http://forums.xamarin.com/discussion/comment/7882 - 我已尝试避免此步骤。

于 2013-03-21T20:12:06.710 回答