gpt4 book ai didi

xamarin.android - 'Realms.Realm' 的类型初始值设定项抛出异常

转载 作者:行者123 更新时间:2023-12-04 07:21:10 26 4
gpt4 key购买 nike

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

我在 iOS 项目上运行良好,但在尝试调用 Realm.GetInstance() 时在 Droid 项目上遇到异常;

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

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

如果 MvvmCross 设置发生在加载 Realm dll 之前,我已经缩小了我认为反射的问题。

例如,如果我在任何继承自 MvxActivity 或 MvxAppCompatActivity 的事件(或 Mvvmcross Setup/CreateApp 进程中的任何地方)中调用 Realm.GetInstance(),则会发生异常。

但是,如果我首先从普通的 Droid Activity 调用 var db = Realm.GetInstance() (& db.Close()),然后通过启动 MvxActivity 从 Droid Activity 启动 Mvx 设置过程,它工作正常,并在整个应用程序生命周期中继续工作。

同样,如果我将 Application 子类化并在 OnCreate() 中打开一个 Realm 实例并关闭它,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 上放了一个测试项目 https://github.com/vurtigo/TestRealm

最佳答案

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

Realm 类的静态构造函数 walks through all the assemblies in the current AppDomain发现所有继承自 RealmObject 的类型。但是,如果此时 Xamarin Android 构建 Java 绑定(bind)代码,这将定义一个新的 System.Reflection.Emit.AssemblyBuilder 程序集,该程序集将在枚举其类型时引发 TypeLoadException(参见 Bug 39679 - ReflectionTypeLoadException after some reflection stuff )。

解决方法是在任何 MvvmCross 代码导致 Xamarin Android 发出绑定(bind)代码之前调用 Realm 静态构造函数。您可以通过访问 Realm 上的任何静态成员(例如 ReferenceEquals)或什至将其包含在 typeof(Realm) 表达式中来做到这一点。我想 MvxApplication.Initialize() 是执行此操作的好地方。

无论如何,我已经提出了a fix这通常会忽略 AssemblyBuilder 实例。下一个 Realm 版本应该包含它,您将能够在升级后立即删除解决方法代码。

关于xamarin.android - 'Realms.Realm' 的类型初始值设定项抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37742947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com