2017-09-05 7 views
0

런타임시 예외가 발생합니다. Xamarin Realm이 (가) realmobject에 링커가 없습니다.

내 솔루션은 비주얼 스튜디오 맥과 PCL, 안드로이드와 IOS 프로젝트 및 각 프로젝트에 설치된 영역 패키지 1.6.0를 포함 "어떤 realmobject는. 링커는 .... 그들을 제거하지 않았다". 또한 Fodyweaver.xml에 올바른 참조가 포함되어 있고 모든 패키지의 버전이 동일한 지 확인했습니다.

솔루션과 동일한 폴더에 PCL이 포함되어있는 경우 (예 : PCL이있는 기본 멀티 플랫폼 솔루션) 모든 것이 정상적으로 작동합니다.

그러나 여러 영역에서 사용할 수 있도록 모든 영역 논리를 포함하는 PCL 프로젝트를 별도의 폴더로 옮겼습니다. 내 솔루션에는 이제이 외부 폴더의 PCL이 포함되며 iOS 및 Android 프로젝트는 영역 패키지를 참조합니다. 응용 프로그램이 잘 컴파일되지만 응용 프로그램을 실행할 때 realm.getinstance를 사용하는 첫 번째 호출에서이 예외가 수신됩니다.

원래 솔루션과 동일한 폴더에 PCL 프로젝트를 다시 입력하면 정상적으로 작동합니다.

누구든지이 문제를 해결할 수 있습니까? 나는 Viper 아키텍처를 사용하고 난 여러 솔루션에서 동일한 모델을 공유하는

답변

0

지금 문제를 해결했습니다. 먼저 @sushhangover에서 솔루션을 적용했지만 곧바로 작동하지 않았습니다.

약간의 조사 후 컴파일러가 클래스와 영역 객체를 라이브러리에 전혀 짜 넣지 않았 음을 발견했습니다.

간단히 라이브러리를 내 주요 솔루션과 별도로로드하고 영역 패키지와 Fody를 제거하고 다시로드하고 모두 정리하고 모두 다시 작성하십시오.그리고 나는 fodyweaver가 제대로 작동하는 것을 볼 수있었습니다. 그런 다음 내 주 솔루션에 참조를 다시 추가하면 모든 것이 작동합니다.

1

이 별도의 라이브러리 (PCL 또는 NetStd)에 내 RealmObject 모델을 배치 할 때 내가 가지고있는 같은 문제입니다.

Realms.Realm.GetInstance (....)가 호출되면 Realm 초기화에서는 RealmObject이 동일한 어셈블리에 있거나 해당 어셈블리가 이미로드되어 있다고 가정하지만이 경우에는 그렇지 않습니다. 당신은이 GetInstance를 호출 경고가합니다 (Fody 처리를 통해) 구축 어셈블리에서 발행되는 컴파일러 등의 경우 말할 수 있지만 그 안에 어떤 RealmObjects을 가지고 있지 않습니다

경고 : Fody를/RealmWeaver : 기본 스키마가 비어있는 것 같습니다. RealmObject 상속자가 선언되지 않은 경우에는 오류가 아닙니다. 그렇지 않으면 위버와 관련된 버그 일 수 있습니다. (GeneticCancerSelectors)

그래서 나는 내 영역 모델 라이브러리에 정적 클래스를 추가 : 당신이 영역 인스턴스를 얻을 필요가있을 때

public static class RealmModel 
{ 
    public static Realms.Realm GetInstance() => GetInstance(""); 

    public static Realms.Realm GetInstance(string databasePath) => GetInstance(new RealmConfiguration(databasePath)); 

    public static Realms.Realm GetInstance(RealmConfigurationBase config = null) => Realms.Realm.GetInstance(config); 

    public static Task<Realms.Realm> GetInstanceAsync(RealmConfigurationBase config) => Realms.Realm.GetInstanceAsync(config); 
} 

을 이제 호출하지 않습니다

Realms.Realm.GetInstance() 

그러나 모델 조립품에있는 모델 번호로 전화하십시오.

RealmModel.GetInstance() 
+1

이것이 작동하는 이유를 명확히하기 위해 - 직공은 PCL/NetStandard lib의 모듈 초기화 프로그램에 등록 코드를 삽입하여 Realm에 모델을 알립니다. Library가로드되기 전에 Realm을 사용하면 cctor가 실행되지 않으므로 문제가 발생하므로 라이브러리의 모델이 등록되지 않았습니다. 제안 된 코드를 변경하면 인스턴스를 가져 오기 전에 라이브러리에 액세스했는지 확인하므로 제대로 작동합니다. 또는 라이브러리에 더미'Init()'메소드를 추가하고 앱 실행시이를 호출하여 열심히로드하고 cctor를 호출 할 수 있습니다. –

+0

@NikolaIrinchev 추가 정보를 가져 주셔서 감사합니다. 더미 이니셜 라이저에 대해 뭔가를 추가해야합니다. 내 저장소 설정은 항상 내 Realm 모델의 GetInstance를 가져 와서 아무도 "사전 초기화"를 기억하지 않아야하므로 다른 어셈블리에서 직조 할 것이 없으므로 Fody/RealmWeaver 컴파일러 경고가 표시되지 않습니다. – SushiHangover

+0

나는 VIPER도 사용하고 있습니다 :). 의미가 있습니다 -하지만 그것을 시도하고 내 솔루션에 대해 작동하지 않습니다. 정적 인 Getinstance() 메소드를 추가 한 DataService 클래스가 있습니다. Dataservice는 ninject 라이브러리를 사용하여 종속성 주입을 사용하여 초기화됩니다. 따라서 dataservice 인스턴스가 ninject에 의해 초기화 될 때 생성자가 호출되며 여기서 정적 Getinstance를 호출합니다.하지만 예외는 여전히 발생합니다. 내가 Datacvice에 더미 intialiser를 사용해 보았지만 여전히 실패했습니다. –