Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/

故障排除 - .NET SDK

在此页面上

  • 解决“类中没有属性”异常
  • Fody:“发生未处理的异常”
  • Fody Weave 异常
  • 对 WriteAsync 问题进行故障排除
  • 解决“在创建 Realm 实例之前应调用 AddDefaultTypes”异常
  • 原因解释
  • 解决方案
  • iOS/iPad OS 分配错误/可用内存不足

您可能会看到一个 System.InvalidOperationException ,其中包含消息“类中没有属性,链接器是否剥离它?”。

造成此异常的三个已知原因:

  • 没有编织 RealmObject,可能是因为 Fody 出现问题。如果是这种情况, RealmSchema会引发异常。有关如何修复此问题的详细信息,请参阅 Fody Weave 异常

  • 链接器已从一个或多个 RealmObject 中剥离属性,而 Realm 认为这些属性不存在。 如果您的 链接器行为 设置为Link all assemblies ,但尚未在类声明中使用[Preserve(AllMembers = true)] 属性。链接器仅保留您在代码中显式引用或标有[Preserve(AllMembers = true)]属性的类成员。 这意味着,如果您想在 Realm 中持久保存某个属性,而代码中的任何位置都没有引用该属性,则链接器可能会将其删除,从而导致模式不匹配。

  • 您正在使用的代码混淆工具会干扰模型名称检测。 Realm 依赖类名来生成模式,因此如果代码混淆工具隐藏了这些类名,则模式生成将失败。 要解决此问题,请将代码混淆工具设置为忽略模型类。

当您已经构建了一个项目,然后添加新的RealmObject子类时,就会触发这种常见的构建失败。 选择 BuildRun项目不会彻底重建项目,不足以调用 Fody Weaver。 要解决此问题,请选择Rebuild项目。

您可能会在构建日志中看到有关尚未编织类的警告。 这表明 Fody 编织包未正确安装。 以下是一些需要检查的事项:

  • 首先,检查FodyWeavers.xml文件是否包含 Realm 条目。

  • 也有可能是 Fody 安装失败。 用户在使用 Visual Studio 2015 和 3.2 之前的 NuGet 经理包版本时也曾遇到过这种情况。要诊断此问题,请使用文本编辑器检查您的.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 Package Manager。 如果这不起作用,则 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()方法中,我们检查是否存在非空SynchronizationContext.Current对象,以确定代码是否在用户界面线程上执行。 如果您在工作线程中设置了Current ,则此检查可能不准确。 如果已在工作线程中设置SynchronizationContext.Current ,请调用Write()方法而不是WriteAsync()

有关更多信息,请参阅异步写入。

您可能会看到一个System.NotSupportedException ,其中包含“创建 Realm 实例之前应调用 AddDefaultTypes”消息。 如果您有多个项目包含 Realm 模型,并且您在将所有项目加载到内存之前打开了 Realm 实例,则可能会发生这种情况。

.NET 使用延迟加载来提高性能。 直到需要程序集包含的一个或多个类型时,才会加载程序集。 但是,Realm 依赖于 模块初始化程序 以在其默认模式中注册所有类型。首次打开 Realm 时,默认模式会被锁定,任何注册更多类型的尝试都会导致上述异常。

有 3 种方法可以解决此问题:

  1. 您可以将 Realm 模型放在调用Realm.GetInstance的同一程序集中。

  2. 您可以通过在程序集上创建静态方法来预加载包含 Realm 对象的程序集,然后从应用代码中调用该方法:

    // In your models assembly
    public static class MyAssemblyLoader
    {
    public static void LoadMe() {}
    }
    // In your app
    public void Initialize()
    {
    MyAssemblyLoader.LoadMe();
    }
  3. 您可以在初始化 Realm 时显式指定 Realm 模式:

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

在可用内存很少的 iOS 或 iPad 设备中,或者使用多个 Realm 或许多通知的内存密集型应用程序中,您可能会遇到以下错误:

libc++abi: terminating due to an uncaught exception of type std::bad_alloc: std::bad_alloc

该错误通常表示由于可用内存不足而无法分配资源。

如果您正在针对 iOS15 + 或 iPad15 + 进行构建,则可以添加 扩展虚拟寻址权利 以解决此问题。

将这些键添加到 Property List 中,并将值设置为 true

<key>com.apple.developer.kernel.extended-virtual-addressing</key>
<true/>
<key>com.apple.developer.kernel.increased-memory-limit</key>
<true/>

后退

兼容性

来年

SDK 遥测