Xamarin.android '的类型初始值设定项;领域';抛出异常

Xamarin.android '的类型初始值设定项;领域';抛出异常,xamarin.android,mvvmcross,realm,Xamarin.android,Mvvmcross,Realm,我试图在一个较小的Xamarin/Mvvmcross/iOS/Droid项目上实现Realm,以测试它替换SQLite的能力 我在iOS项目上工作得很好,但在尝试调用Realm.GetInstance()时,Droid项目出现异常 “Realms.Realm”的类型初始值设定项引发异常 内部异常 System.Reflection.ReflectionTypeLoadException 无法加载模块中的类 我已经缩小了范围,我认为如果MvvmCross设置发生在领域dll加载之前,则会出现反射问

我试图在一个较小的Xamarin/Mvvmcross/iOS/Droid项目上实现Realm,以测试它替换SQLite的能力

我在iOS项目上工作得很好,但在尝试调用Realm.GetInstance()时,Droid项目出现异常

“Realms.Realm”的类型初始值设定项引发异常

内部异常 System.Reflection.ReflectionTypeLoadException 无法加载模块中的类

我已经缩小了范围,我认为如果MvvmCross设置发生在领域dll加载之前,则会出现反射问题

例如,如果我在从MVXAActivity或MvxAppCompatActivity继承的任何活动(或Mvvmcross设置/CreateApp过程中的任何位置)中调用Realm.GetInstance(),则会发生异常

但是,如果我首先从正常Droid活动调用var db=Realm.GetInstance()(&db.Close()),然后通过从Droid活动启动Mvx活动来启动Mvx安装过程,则它可以正常工作,并在整个应用程序生命周期中继续工作

同样,如果我将应用程序子类化并在OnCreate()中打开一个领域实例并关闭它,Real将初始化应用程序中的任何其他地方

示例代码

//工作

[Application]
public class CustomApplication : Application
{
    public CustomApplication (IntPtr javaReference, JniHandleOwnership transfer) : base (javaReference, transfer)
    {
    }

    public override void OnCreate ()
    {
        base.OnCreate ();
        var db = Realm.GetInstance ();
        db.Close ();
    }
}
//除非已调用过一次Realm.GetInstance(),否则不起作用

[Activity(Label = "View for FirstViewModel")]
public class FirstView : MvxActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.FirstView);
        var db = Realm.GetInstance ();
        db.Close ();
    }
}

我在github上放置了一个测试项目,位于

这是Realm和Xamarin Android之间的一个不幸的混淆

Realm
类上的静态构造函数,用于发现继承自
RealmObject
的所有类型。但是,如果在Xamarin Android构建Java绑定代码时,这将定义一个新的
System.Reflection.Emit.AssemblyBuilder
程序集,该程序集将在枚举其类型时引发
TypeLoadException
(请参阅)

解决方法是在任何MvvmCross代码导致Xamarin Android发出绑定代码之前,先调用
领域
静态构造函数。您可以通过访问
Realm
上的任何静态成员(如
ReferenceEquals
)或甚至将其包含在
typeof(Realm)
表达式中来实现这一点。我想
MvxApplication.Initialize()
是一个很好的地方


在任何情况下,我都建议一般忽略
AssemblyBuilder
实例。下一个Realm版本应该包括它,您可以在升级后立即删除解决方案代码。

我尝试在Xamarin Android Player中运行该项目(在API 22图像上),它对我有效。你在什么上运行应用程序?我已将测试项目重置为非工作版本。我已经在Xamarin Android播放器上测试了API 22。如果您从MvxApplication.Initialize调用Realm.GetInstance,它也会起作用,并且代码已经保留在其中。现在它被注释掉了。谢谢,谢谢,我确认了。