문제 해결 - .NET SDK
이 페이지의 내용
'클래스에 속성 없음' 예외 해결
"클래스에 속성이 없습니다, 링커가 이를 제거했나요?"라는 메시지와 함께 System.InvalidOperationException
가 표시될 수 있습니다.
이 예외의 알려진 원인에는 세 가지가 있습니다.
RealmObjects가 표시되지 않는 경우, Fody에 문제가 발생했기 때문일 수 있습니다. 이 경우
RealmSchema
에서 예외가 발생합니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 Fody Weave 예외 를 참조하세요.링커에 하나 이상의 RealmObjects에서 제거된 속성이 있으며 Realm 은 해당 속성이 존재하지 않는다고 생각합니다. 이는 링커 동작 이 있는 경우 발생할 수 있습니다.
Link all assemblies
[Preserve(AllMembers = true)]
으)로 설정하다 되었지만 클래스 선언에 속성을 사용하지 않았습니다. 링커는 코드에서 명시적으로 참조했거나 속성으로 표시한 클래스 멤버만[Preserve(AllMembers = true)]
보존합니다. 즉, 속성 을 영역 에 유지하려고 하는데 해당 속성이 코드의 어느 곳에서도 참조되지 않는 경우 링커가 해당 속성을 제거 하여 스키마 불일치를 일으킬 수 있습니다.모델 이름 감지를 방해하는 코드 난독화 도구를 사용하고 있습니다. Realm은 클래스 이름을 사용하여 스키마를 생성하므로 코드 난독화 도구가 해당 클래스 이름을 숨긴 경우 스키마 생성이 실패합니다. 이 문제를 해결하려면 모델 클래스를 무시하도록 코드 난독화 도구를 설정하세요.
Fody: '처리되지 않은 예외가 발생했습니다'
이 일반적인 빌드 실패는 이미 프로젝트를 빌드한 다음 새 RealmObject
하위 클래스를 추가할 때 트리거됩니다. 프로젝트에서 Build 또는 Run 을(를) 선택하면 Fody Weaver를 호출할 만큼 프로젝트를 철저하게 다시 빌드하지 못합니다. 이 문제를 해결하려면 프로젝트를 Rebuild 으로 선택합니다.
Fody Weave 예외
빌드 로그에 클래스가 구성되지 않았다는 경고가 표시될 수 있습니다. 이는 Fody We빙 패키지가 제대로 설치되지 않았음을 나타냅니다. 다음은 몇 가지 확인할 사항입니다.
먼저
FodyWeavers.xml
파일에 Realm에 대한 항목이 포함되어 있는지 확인합니다.Fody 설치가 실패했을 수도 있습니다. 사용자는 Visual Studio 2015 및 NuGet 패키지 관리자 3.2 이전 버전에서 이러한 문제를 경험한 적이 있습니다. 이를 진단하려면 텍스트 편집기를 사용하여
.csproj
에Fody.targets
를 가져오는 줄이 있는지 확인하세요.<Import Project="..\packages\Fody.1.29.3\build\portable-net+sl+win+wpa+wp\Fody.targets" Condition="Exists('..\packages\Fody.1.29.3\build\portable-net+sl+win+wpa+wp\Fody.targets')" />
가장 쉬운 수정은 최신 버전의 NuGet 패키지 관리자로 업그레이드하는 것입니다. 그래도 문제가 해결되지 않으면 Fody 및 Microsoft.Bcl.Build.targets
에 문제가 있을 수 있습니다. .csproj 파일에서 다음 줄 제거 파일이 도움이 될 수 있습니다:
<Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
WriteAsync 문제 해결
WriteAsync()
메서드 내에서 null이 아닌 SynchronizationContext.Current
객체를 확인하여 코드가 UI 스레드에서 실행되는지 확인합니다. 작업자 스레드에서 Current
을(를) 설정한 경우 이 검사가 정확하지 않을 수 있습니다. 작업자 스레드에서 SynchronizationContext.Current
을 설정한 경우 WriteAsync()
대신 Write()
메서드를 호출합니다.
자세한 내용은 비동기 쓰기를 참조하세요.
'Realm 인스턴스를 생성하기 전에 AddDefaultTypes를 호출해야 함' 예외 해결
"Realm 인스턴스를 생성하기 전에 AddDefaultTypes를 호출해야 합니다"라는 메시지와 함께 System.NotSupportedException
가 표시될 수 있습니다. 이는 Realm 모델이 포함된 프로젝트가 여러 개 있고 모든 프로젝트가 메모리에 로드되기 전에 Realm 인스턴스를 열 때 발생할 수 있습니다.
원인 설명
.NET은 지연 로딩을 사용하여 성능을 개선합니다. 어셈블리에 포함된 유형 중 하나 이상이 필요할 때까지 어셈블리가 로드되지 않습니다. 그러나 Realm은 모듈 이니셜라이저 를 사용합니다. 기본 스키마에 모든 유형을 등록합니다. Realm을 처음 열면 기본 스키마가 잠기며 더 많은 유형을 등록하려고 하면 위의 예외가 발생합니다.
해상도
이 문제를 해결하는 방법은 3가지가 있습니다.
Realm.GetInstance
을(를) 호출하는 것과 동일한 어셈블리에 영역 모델을 배치할 수 있습니다.어셈블리에 정적 메서드를 생성하여 영역 객체가 포함된 어셈블리를 미리 로드한 다음 앱 코드에서 해당 메서드를 호출할 수 있습니다.
// In your models assembly public static class MyAssemblyLoader { public static void LoadMe() {} } // In your app public void Initialize() { MyAssemblyLoader.LoadMe(); } 영역을 초기화할 때 Realm 스키마를 명시적으로 지정할 수 있습니다.
var config = new RealmConfiguration { Schema = new[] { typeof(Person), typeof(Company), ... } }
iOS/iPad OS 할당 불량/사용 가능한 메모리 부족
메모리가 부족한 iOS 또는 iPad 장치나 다수의 영역 또는 많은 알림을 사용하는 메모리 집약적인 애플리케이션을 사용하는 경우 다음과 같은 오류가 발생할 수 있습니다.
libc++abi: terminating due to an uncaught exception of type std::bad_alloc: std::bad_alloc
이 오류는 일반적으로 사용 가능한 메모리가 부족하여 리소스를 할당할 수 없음을 나타냅니다.
iOS + 또는 iPad +용으로 빌드하는 경우 확장 15 15 가상 주소 지정 권한 을 추가할 수 있습니다. 을(를) 클릭하여 이 문제를 해결하세요.
속성 목록에 다음 키를 추가하고 값을 true
으로 설정합니다.
<key>com.apple.developer.kernel.extended-virtual-addressing</key> <true/> <key>com.apple.developer.kernel.increased-memory-limit</key> <true/>