2016-06-10 52 views
1

我正試圖在較小的Xamarin/Mvvmcross/iOS/Droid項目上實現Realm以測試它是否能夠替換SQLite。'Realms.Realm'的類型初始值設定項引發異常

我在iOS項目上工作得很好,但在嘗試調用Realm.GetInstance()時在Droid項目上收到異常。

的類型初始關於「Realms.Realm」引發了異常

內部異常 System.Reflection.ReflectionTypeLoadException 模塊中的類不能被加載。

如果在加載Realm dll之前發生MvvmCross設置,我已經縮小了它的範圍,我認爲這是反射問題。

例如,如果我在任何從MvxActivity或MvxAppCompatActivity(或Mvvmcross Setup/CreateApp進程中的任何位置)繼承的活動中調用Realm.GetInstance(),則會發生異常。

然而,如果我請變種分貝= Realm.GetInstance()(& db.Close())從正常的活動德羅伊德第一,然後啓動MVX安裝過程,通過啓動MvxActivity,從德羅伊德活動它的工作原理很好,並且繼續在應用程序生命週期中工作。

同樣,如果我繼承應用程序並在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

+0

我試着在Xamarin Android Player(在API 22圖像上)運行項目,它對我很有用。你在哪些應用上運行? – Tayschrenn

+0

我已將測試項目重置爲非工作版本。我在Xamarin Android Player上測試了API 22。原來,如果你從MvxApplication.Initialize中調用Realm.GetInstance,它也可以工作 - 並且該代碼已經被留下。現在它已被註釋掉。謝謝 –

+0

謝謝,我確認了。 – Tayschrenn

回答

0

這是Realm和Xama之間不幸的混淆rin Android。

Realmwalks through all the assemblies in the current AppDomain上的靜態構造函數,用於發現從RealmObject繼承的所有類型。但是,如果在Xamarin Android構建Java綁定代碼時,這將定義一個新的System.Reflection.Emit.AssemblyBuilder程序集,在枚舉其類型(請參閱Bug 39679 - ReflectionTypeLoadException after some reflection stuff)時將引發TypeLoadException

解決方法是在任何MvvmCross代碼導致Xamarin Android發出綁定代碼之前,調用Realm靜態構造函數。您可以通過訪問Realm上的任何靜態成員(如ReferenceEquals或甚至將其包含在typeof(Realm)表達式中)來完成此操作。我想MvxApplication.Initialize()是一個很好的去做的地方。

無論如何,我建議a fix一般會忽略AssemblyBuilder實例。下一個Realm版本應該包含它,您可以在升級後立即刪除解決方法代碼。

相關問題