0

这发生在第一次调用Realm.GetInstance. 仅在 iOS 上发生 - 在 Android 上运行良好。Realm 版本是 0.77.2。

这是一个带有 MvvmCross 和 ReactiveUI 的 Xamarin 项目,但很可能这无关紧要。

Realm.GetInstance在引导 MvvmCross 并显示至少一个屏幕之后,调用发生得有点晚 - 虽然类似于 Android。

错误是:

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 
4

2 回答 2

1

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

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

我发现在 Xamarin 上链接的命名约定非常违反直觉。如果你用Attempt Stripping Unused代替Link,这些名称会更有意义,例如:Don't Attempt Attempt Stripping Unused

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

是的

您能否发布正在使用的确切 IOS 和 Xamarin Studio 版本?

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

我添加了issue 822来跟踪它作为 Realm 中的一个相当高的优先级。

于 2016-09-07T10:04:16.930 回答
1

由于这是一个反射问题 ( ReflectionTypeLoadException),我不得不假设“Xamarin.iOS”链接器正在删除一些类。

您可以手动将[Xamarin.iOS.Foundation.Preserve]属性添加到这些类(或成员),这样它们就不会被链接出去,因为您可能希望在发布版本中将链接器设置为链接全部或仅链接 SDK 以减小最终.ipa大小。

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

有时您想保留某些成员,但前提是保留了包含类型。在这些情况下,请使用 [Preserve (Conditional=true)]

参考:保留代码

于 2016-09-07T09:38:01.870 回答