Docs Menu
Docs Home
/ /
Atlas Device SDK
/

문제 해결 - .NET SDK

이 페이지의 내용

  • '클래스에 속성 없음' 예외 해결
  • Fody: '처리되지 않은 예외가 발생했습니다'
  • Fody Weave 예외
  • WriteAsync 문제 해결
  • 'Realm 인스턴스를 생성하기 전에 AddDefaultTypes를 호출해야 함' 예외 해결
  • 원인 설명
  • 해상도
  • iOS/iPad OS 할당 불량/사용 가능한 메모리 부족

"클래스에 속성이 없습니다, 링커가 이를 제거했나요?"라는 메시지와 함께 System.InvalidOperationException 가 표시될 수 있습니다.

이 예외의 알려진 원인에는 세 가지가 있습니다.

  • RealmObjects가 표시되지 않는 경우, Fody에 문제가 발생했기 때문일 수 있습니다. 이 경우 RealmSchema 에서 예외가 발생합니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 Fody Weave 예외 를 참조하세요.

  • 링커에 하나 이상의 RealmObjects에서 제거된 속성이 있으며 Realm 은 해당 속성이 존재하지 않는다고 생각합니다. 이는 링커 동작 이 있는 경우 발생할 수 있습니다.Link all assemblies [Preserve(AllMembers = true)] 으)로 설정하다 되었지만 클래스 선언에 속성을 사용하지 않았습니다. 링커는 코드에서 명시적으로 참조했거나 속성으로 표시한 클래스 멤버만 [Preserve(AllMembers = true)] 보존합니다. 즉, 속성 을 영역 에 유지하려고 하는데 해당 속성이 코드의 어느 곳에서도 참조되지 않는 경우 링커가 해당 속성을 제거 하여 스키마 불일치를 일으킬 수 있습니다.

  • 모델 이름 감지를 방해하는 코드 난독화 도구를 사용하고 있습니다. Realm은 클래스 이름을 사용하여 스키마를 생성하므로 코드 난독화 도구가 해당 클래스 이름을 숨긴 경우 스키마 생성이 실패합니다. 이 문제를 해결하려면 모델 클래스를 무시하도록 코드 난독화 도구를 설정하세요.

이 일반적인 빌드 실패는 이미 프로젝트를 빌드한 다음 새 RealmObject 하위 클래스를 추가할 때 트리거됩니다. 프로젝트에서 Build 또는 Run 을(를) 선택하면 Fody Weaver를 호출할 만큼 프로젝트를 철저하게 다시 빌드하지 못합니다. 이 문제를 해결하려면 프로젝트를 Rebuild 으로 선택합니다.

빌드 로그에 클래스가 구성되지 않았다는 경고가 표시될 수 있습니다. 이는 Fody We빙 패키지가 제대로 설치되지 않았음을 나타냅니다. 다음은 몇 가지 확인할 사항입니다.

  • 먼저 FodyWeavers.xml 파일에 Realm에 대한 항목이 포함되어 있는지 확인합니다.

  • Fody 설치가 실패했을 수도 있습니다. 사용자는 Visual Studio 2015 및 NuGet 패키지 관리자 3.2 이전 버전에서 이러한 문제를 경험한 적이 있습니다. 이를 진단하려면 텍스트 편집기를 사용하여 .csprojFody.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() 메서드 내에서 null이 아닌 SynchronizationContext.Current 객체를 확인하여 코드가 UI 스레드에서 실행되는지 확인합니다. 작업자 스레드에서 Current 을(를) 설정한 경우 이 검사가 정확하지 않을 수 있습니다. 작업자 스레드에서 SynchronizationContext.Current 을 설정한 경우 WriteAsync() 대신 Write() 메서드를 호출합니다.

자세한 내용은 비동기 쓰기를 참조하세요.

"Realm 인스턴스를 생성하기 전에 AddDefaultTypes를 호출해야 합니다"라는 메시지와 함께 System.NotSupportedException 가 표시될 수 있습니다. 이는 Realm 모델이 포함된 프로젝트가 여러 개 있고 모든 프로젝트가 메모리에 로드되기 전에 Realm 인스턴스를 열 때 발생할 수 있습니다.

.NET은 지연 로딩을 사용하여 성능을 개선합니다. 어셈블리에 포함된 유형 중 하나 이상이 필요할 때까지 어셈블리가 로드되지 않습니다. 그러나 Realm은 모듈 이니셜라이저 를 사용합니다. 기본 스키마에 모든 유형을 등록합니다. Realm을 처음 열면 기본 스키마가 잠기며 더 많은 유형을 등록하려고 하면 위의 예외가 발생합니다.

이 문제를 해결하는 방법은 3가지가 있습니다.

  1. Realm.GetInstance 을(를) 호출하는 것과 동일한 어셈블리에 영역 모델을 배치할 수 있습니다.

  2. 어셈블리에 정적 메서드를 생성하여 영역 객체가 포함된 어셈블리를 미리 로드한 다음 앱 코드에서 해당 메서드를 호출할 수 있습니다.

    // In your models assembly
    public static class MyAssemblyLoader
    {
    public static void LoadMe() {}
    }
    // In your app
    public void Initialize()
    {
    MyAssemblyLoader.LoadMe();
    }
  3. 영역을 초기화할 때 Realm 스키마를 명시적으로 지정할 수 있습니다.

    var config = new RealmConfiguration
    {
    Schema = new[] { typeof(Person), typeof(Company), ... }
    }

메모리가 부족한 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/>

돌아가기

호환성