xamarinxamarin.androidmvvmcross

How to load plugins when updating to MvvmCross 6.4.2 from 5.6.2


I've been tasked with maintaining a Xamarin native project using MvvmCross 5.6.2. Not knowing exactly how to approach this, I've decided to update to one major version at a time (6 first, then 7 and 8). I'm not sure why I specifically have chosen 6.4.2, but it was maybe because this was the latest version of the majority of the plugins I was using on Nuget.

So far, the update has been a success and I have been able to fix all build errors. However, when running the application, I've been getting a null reference exception which I can't fully trace.

Based on the limited application output, I've been able to determine that the problem lies somewhere in my Android's setup.cs class (I think). I've been following Nick's .NET Travels advice on MvvmCross debugging. From viewing the MvvmCross 6.4.2. source and pasting in the following code in my own overrides:

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

I'm able to see that GetPluginAssemblies doesn't return any enumerable, and the LoadPlugins method then produces the NullReferenceException. But I can't see what this NullReference actually is.

I followed the upgrading from 5 to 6 guide https://www.mvvmcross.com/documentation/upgrading/upgrade-to-mvvmcross-60.

I looked at the MvvmCross 6 and 6.4.0 release pages: https://www.mvvmcross.com/mvvmcross-6.0.0-release/ https://www.mvvmcross.com/mvvmcross-6.4.0-release/

And I followed Benjamin Mayrargue's guide: https://medium.com/@bigoudi/upgrading-from-mvvmcross-5-to-mvvmcross-6-7ded83ecb69d

But I have been unable to load my plugins (previously they were bootstraps, but most of the guides say these can be discarded now and that loading plugins is easier).

I also attempted the answer suggested in this question How to use an mvvmcross plugin such as the file plugin.

But to no avail.

So I am asking if anyone knows a good guide or how to use plugins in MvvmCross 6.4.2.

Thank you.


Solution

  • I want to thank Cheesebaron for his plugin support. I think I've fixed my issue and as it turned out, I don't think there is a plugin issue after all (yet).

    Thanks to Toolmakersteve also. His suggestion for using a try catch in the OnCreate of my overridden MvxSplashScreenAppCompatActivity surfaced an issue with setting a theme for this activity. In actuality, this class was initially a MvxSplashScreenActivity.

    Reverting this line, I then started getting NullReferenceExceptions on specific lines, all relating to IoC and lazy construction of singletons. The class Mvx seemed to be throwing up this error. On a sort of hunch from previous experience with my updating, I removed the MvvmCross.Platform using statement and checked what suggestions Mvx had available to it. It suggested MvvmCross and MvvmCross.Platform, so I tried the former instead. Sure enough, this moved my execution further, throwing up more Null Reference Exceptions. I also encountered one instance of failing to resolve IMvxResourceLoader from MvvmCross.Platform.Platform. Switching that to MvvmCross.Base did the trick.

    This was only a chance fix through a bit of guess work. @CheeseBaron, should I add this as a note to this bit of documentation https://www.mvvmcross.com/documentation/upgrading/upgrade-to-mvvmcross-60? As mentioned, I'm as far as 6.4.2 now, so I'm not certain this is the right place for it.

    I've got a few bugs with embedded resources to fix now, but if I encounter any more that are relevant to my question, I'll list them here.