首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从5.6.2更新到MvvmCross 6.4.2时如何加载插件

从5.6.2更新到MvvmCross 6.4.2时如何加载插件
EN

Stack Overflow用户
提问于 2022-07-26 19:01:33
回答 2查看 47关注 0票数 0

我的任务是使用MvvmCross 5.6.2维护Xamarin本机项目。由于不知道如何处理这个问题,我决定一次更新到一个主要版本(第6次,然后第7次和第8次)。我不知道为什么我特别选择6.4.2,但这可能是因为这是我在Nuget上使用的大多数插件的最新版本。

到目前为止,更新是成功的,我已经能够修复所有的构建错误。但是,在运行应用程序时,我得到了一个空引用异常,无法完全跟踪该异常。

基于有限的应用程序输出,我已经能够确定这个问题存在于我的Android的setup.cs类中(我认为)。我一直在遵循尼克的.NET游记关于MvvmCross调试的建议。查看MvvmCross 6.4.2。源并在我自己的重写中粘贴以下代码:

代码语言:javascript
复制
public virtual void LoadPlugins(IMvxPluginManager pluginManager)
{
     Type pluginAttribute = typeof(MvxPluginAttribute);
     IEnumerable<Assembly> pluginAssemblies = GetPluginAssemblies();
     foreach (Assembly item in pluginAssemblies)
     {
         IEnumerable<Type> enumerable = item.ExceptionSafeGetTypes();
         foreach (Type item2 in enumerable)
         {
             if (TypeContainsPluginAttribute(item2))
             {
                 pluginManager.EnsurePluginLoaded(item2);
             }
        }
     }
    
     bool TypeContainsPluginAttribute(Type type)
     {
         object[] customAttributes = type.GetCustomAttributes(pluginAttribute, inherit: false);
         return ((customAttributes != null && customAttributes.Length != 0) ? 1 : 0) > (false ? 1 : 0);
     }
}
         
public virtual IEnumerable<Assembly> GetPluginAssemblies()
{
       string mvvmCrossAssemblyName = typeof(MvxPluginAttribute).Assembly.GetName().Name;
       Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
       var test = from asmb in assemblies.AsParallel()
                  where AssemblyReferencesMvvmCross(asmb, mvvmCrossAssemblyName)
                  select asmb;
       return test;
}  

我可以看到GetPluginAssemblies不返回任何可枚举的,然后LoadPlugins方法生成NullReferenceException。但我看不出这个NullReference到底是什么。

我遵循了从5到6的升级指南https://www.mvvmcross.com/documentation/upgrading/upgrade-to-mvvmcross-60

我查看了MvvmCross 6和6.4.0发布页面:https://www.mvvmcross.com/mvvmcross-6.0.0-release/ https://www.mvvmcross.com/mvvmcross-6.4.0-release/

我跟随了本杰明·梅尔格的指南:https://medium.com/@bigoudi/upgrading-from-mvvmcross-5-to-mvvmcross-6-7ded83ecb69d

但是我一直无法加载我的插件(以前它们是引导程序,但大多数指南说这些插件现在可以丢弃,加载插件更容易)。

我还尝试了在这个问题如何使用mvvmcross插件(如文件插件)中提出的答案。

但没有结果。

所以我想问的是,是否有人知道一个好的指南,或者如何在MvvmCross 6.4.2中使用插件。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-28 13:24:55

我要感谢Cheesebaron的插件支持。我想我已经解决了我的问题,事实证明,我不认为有插件问题(到目前为止)。

也要感谢Toolmakersteve。他关于在我被覆盖的OnCreate的MvxSplashScreenAppCompatActivity中使用一个尝试捕获的建议出现了一个问题,就是为这个活动设置一个主题。实际上,这个类最初是一个MvxSplashScreenActivity。

回到这一行之后,我开始在特定的行上获得NullReferenceExceptions,所有这些都与IoC和惰性的单点构造有关。Mvx类似乎出现了这个错误。从我之前的更新经验来看,我删除了使用语句的MvvmCross.Platform,并检查了Mvx提供给它的建议。它建议MvvmCross和MvvmCross.Platform,所以我尝试了前者。当然,这进一步推动了我的执行,抛出了更多的Null引用异常。我还遇到了一个无法从IMvxResourceLoader解析MvvmCross.Platform.Platform的实例。把它转到MvvmCross.Base上就行了。

这只是一个机会,通过一些猜测的工作。@CheeseBaron,我应该把它添加到这个文档https://www.mvvmcross.com/documentation/upgrading/upgrade-to-mvvmcross-60中吗?如前所述,我现在已经6.4.2了,所以我不确定这是不是合适的地方。

我现在有一些嵌入资源的bug需要修复,但是如果我遇到更多与我的问题相关的错误,我会在这里列出它们。

票数 0
EN

Stack Overflow用户

发布于 2022-07-27 05:46:49

插件只是在IoC容器中注册东西的一种方式。这是MvvmCross在启动时使用Setup文件中的LoadPlugins方法完成的。

大多数情况下,它应该只是起作用。然而,也有一些警告。

如果链接器已经进行并链接了一些插件代码,您将有一个糟糕的时间。您能做的就是提示mono链接器不要删除代码。

添加一个LinkerPleaseInclude类并在其中添加一个类似于以下内容的Include方法:

代码语言:javascript
复制
new MvvmCross.Plugin.Color.Platforms.Ios.Plugin().Load();

你可以对你想要使用的每一个插件都这样做。

如果LoadPlugins找不到条目程序集,有时它也不会注册插件。您可以在您的override类中使用LoadPlugins,只需调用EnsurePluginLoaded

代码语言:javascript
复制
public override void LoadPlugins(IMvxPluginManager pluginManager)
{
    base.LoadPlugins(pluginManager);

    pluginManager.EnsurePluginLoaded<MvvmCross.Plugin.Color.Platforms.Ios.Plugin>();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73128508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档