当架构被创建时,Realm异常——仅在iOS上

本文关键字:异常 仅在 iOS Realm 创建 | 更新日期: 2023-09-27 18:06:04

这在第一次调用Realm.GetInstance时发生。只在iOS上发生-而在Android上工作得很好。Realm版本是0.77.2。

这是一个带有MvvmCross和ReactiveUI的Xamarin项目,但很可能这并不重要。

Realm.GetInstance的调用发生得有点晚——与Android类似——在MvvmCross启动并至少显示一个屏幕之后。

错误是:

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
  at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (System.Reflection.Assembly,bool)
  at System.Reflection.Assembly.GetTypes () [0x00000] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/corlib/System.Reflection/Assembly.cs:402 
  at Realms.RealmSchema.<BuildDefaultSchema>m__3 (System.Reflection.Assembly a) [0x00000] in <filename unknown>:0 
  at System.Linq.Enumerable+<SelectManyIterator>c__Iterator2`2[TSource,TResult].MoveNext () [0x00059] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/System.Core/System/Linq/Enumerable.cs:423 
  at System.Linq.Enumerable+WhereEnumerableIterator`1[TSource].MoveNext () [0x00062] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/System.Core/System/Linq/Enumerable.cs:147 
  at Realms.RealmSchema.CreateSchemaForClasses (IEnumerable`1 classes, Realms.SchemaHandle schemaHandle) [0x00025] in <filename unknown>:0 
  at Realms.RealmSchema.BuildDefaultSchema () [0x00071] in <filename unknown>:0 
  at System.Lazy`1[T].CreateValue () [0x00075] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/mscorlib/system/Lazy.cs:437 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
  at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/3539/f37444ae/source/maccore/_build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 

当架构被创建时,Realm异常——仅在iOS上

由于这是一个反射问题(ReflectionTypeLoadException),我将不得不假设'Xamarin。iOS的链接器正在移除一些类。

你可以手动添加[Xamarin.iOS.Foundation.Preserve]属性到这些类(或成员),所以他们不链接出来,因为你将可能想要设置链接器链接所有或链接仅SDK在你的发布版本,以减少最终的.ipa大小。

可以将此属性应用于类型的每个成员或类型本身。如果你想保留整个类型,你可以在类型上使用[preserve (AllMembers = true)]语法。

有时您希望保留某些成员,但仅在保留包含类型的情况下。在这些情况下,使用[Preserve (Conditional=true)]

Ref: Preserving Code

我们尝试将[Preserve (AllMembers = true)]属性自动添加到从RealmObject下降的类中,因此您不应该像@SushiHangover建议的那样手动添加它们。

听起来这并没有发生在Fody编织步骤中。这可能是个bug。也可能是我们构建PreserveAttribute的方式与这个版本的IOS不兼容,所以没有采取行动保存

我发现Xamarin上链接的命名约定非常违反直觉。如果您将Link替换为尝试剥离未使用的,则名称更有意义,例如:不要尝试剥离未使用的

你有你自己的RealmObject子类的构造函数吗?

你能告诉我使用的IOS和Xamarin Studio的确切版本吗?

Xamarin版本为4.1.2.18,Xamarin。iOS版本为9.8.2.22。我使用的是VS 2015 Update 3,而不是Xamarin Studio。

我添加了822问题来跟踪这个问题,因为它在Realm中具有相当高的优先级。