故障排除 - .NET SDK
在此页面上
解决“类中没有属性”异常
您可能会看到一个 System.InvalidOperationException
,其中包含消息“类中没有属性,链接器是否剥离它?”。
造成此异常的三个已知原因:
没有编织 RealmObject,可能是因为 Fody 出现问题。 如果是这种情况,
RealmSchema
会引发异常。 有关如何修复此问题的详细信息,请参阅 Fody Weave 异常。链接器已从一个或多个 RealmObject 中剥离属性,而Realm认为这些属性不存在。如果您的 链接器行为 设立为 ,但尚未在类声明中使用
Link all assemblies
[Preserve(AllMembers = true)]
属性。链接器仅保留您在代码中显式引用或标有[Preserve(AllMembers = true)]
属性的类成员。这意味着,如果您想在域中持久保存某个属性,而代码中的任何位置都没有引用该属性,则链接器可能删除其删除,从而导致模式不匹配。您正在使用的代码混淆工具会干扰模型名称检测。 Realm 依赖类名来生成模式,因此如果代码混淆工具隐藏了这些类名,则模式生成将失败。 要解决此问题,请将代码混淆工具设置为忽略模型类。
Fody:“发生未处理的异常”
当您已经构建了一个项目,然后添加新的RealmObject
子类时,就会触发这种常见的构建失败。 选择 Build或Run项目不会彻底重建项目,不足以调用 Fody Weaver。 要解决此问题,请选择Rebuild项目。
Fody Weave 异常
您可能会在构建日志中看到有关尚未编织类的警告。 这表明 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 问题进行故障排除
在WriteAsync()
方法中,我们检查是否存在非空SynchronizationContext.Current
对象,以确定代码是否在用户界面线程上执行。 如果您在工作线程中设置了Current
,则此检查可能不准确。 如果已在工作线程中设置SynchronizationContext.Current
,请调用Write()
方法而不是WriteAsync()
。
有关更多信息,请参阅异步写入。
解决“在创建 Realm 实例之前应调用 AddDefaultTypes”异常
您可能会看到一个System.NotSupportedException
,其中包含“创建 Realm 实例之前应调用 AddDefaultTypes”消息。 如果您有多个项目包含 Realm 模型,并且您在将所有项目加载到内存之前打开了 Realm 实例,则可能会发生这种情况。
原因解释
.NET 使用延迟加载来提高性能。 直到需要程序集包含的一个或多个类型时,才会加载程序集。 但是,Realm 依赖于 模块初始化程序 以在其默认模式中注册所有类型。首次打开 Realm 时,默认模式会被锁定,任何注册更多类型的尝试都会导致上述异常。
解决方案
有 3 种方法可以解决此问题:
您可以将 Realm 模型放在调用
Realm.GetInstance
的同一程序集中。您可以通过在程序集上创建静态方法来预加载包含 Realm 对象的程序集,然后从应用代码中调用该方法:
// In your models assembly public static class MyAssemblyLoader { public static void LoadMe() {} } // In your app public void Initialize() { MyAssemblyLoader.LoadMe(); } 您可以在初始化 Realm 时显式指定 Realm 模式:
var config = new RealmConfiguration { Schema = new[] { typeof(Person), typeof(Company), ... } }
iOS/iPad OS 分配错误/可用内存不足
在可用内存很少的 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/>