2017-01-03 64 views
2

我创建了一个使用F#和ReactiveUI的Xamarin Android项目。使用Xamarin Android与F#和ReactiveUI的运行时错误

当加载我的信息中心内,我会遇到在inherit线此代码段的一个运行时异常(的MissingMethodException型):

type DashboardViewModel(?host: IScreen) = 
    inherit ReactiveViewModel() 
    let host = LocateIfNone host 
    member __.Title with get() = "Dashboard" 
    interface IRoutableViewModel with 
     member __.HostScreen = host 
     member __.UrlPathSegment = "Dashboard" 

错误消息读取

方法“Microsoft.FSharp .Quotations.FSharpExpr.Deserialize40'找不到。

ReactiveViewModel类型是围绕ReactiveObject瘦包装:

type ReactiveViewModel() as this = 
    inherit ReactiveObject() 
    let mutable message = noMessage 
    let uiContext = SynchronizationContext.Current 
    member __.SyncContext with get() = uiContext 
    member this.Message 
     with get() = message 
     and set(value) = 
      this.RaiseAndSetIfChanged(&message, value, "Message") |> ignore 
      if message <> noMessage then this.RaiseAndSetIfChanged(&message, noMessage, "Message") |> ignore 
    member val MessageSent = 
     this.WhenAnyValue(toLinq <@ fun vm -> vm.Message @>).ObserveOn(RxApp.MainThreadScheduler).Where(fun m -> m <> noMessage) with get 

该项目是开源:此刻,它含有非常少的内容。它可以在https://github.com/SpiegelSoft/Astrid找到。

我已经提交了关于Xamarin bug跟踪系统中的错误:https://bugzilla.xamarin.com/show_bug.cgi?id=51000

存在任何已知的修复我可以实现我自己,这样我就可以闭上自己的协议的错误吗?

更新1

我这个周末一直在研究这个问题。

加载的FSharp.Core版本卡住了过时版本2.3.98.1。这相当于FSharp.Core.dll文件中

C:\ Program Files文件(x86)的\参考 大会\微软\框架\ MonoAndroid \ V1.0

我曾试图删除这个版本和负载NuGet包FSharp.Core;但是,当我构建Android项目时,路径始终会回到参考程序集路径中的废弃文件。

有没有办法来覆盖这种行为?

更新2

Reference Assemblies路径更换FSharp.Core.dll文件修复该问题,但是这是一个非常不理想橡皮膏,我不能让我的用户应用。理想情况下,我想找到一种方法来阻止.Droid项目从GAC加载FSharp.Core而不是NuGet包。

+0

我想'MissingMemberException'相当于'MissingMethodException'。如果是这样,这里的一些现有的帖子可能对你有帮助:http://stackoverflow.com/search?q=%5Bf%23%5D+MissingMethodException –

+0

我的错误 - 这是一个'MissingMethodException'。问题修正。 –

+0

这些是IME,总是由版本冲突引起的。 –

回答

2

我刚才遇到了一个非常类似的问题。我的android应用程序引用了一个Profile7 F#PCL库,该库使用了List.unfold,我相信这是在F#4中引入的。当我在应用程序中使用该库时,看到类似于您所看到的MissingMethodException。 Xamarin在创建新的Android应用程序时默认引用的FSharp.Core版本没有这个新的方法。我通过编辑应用程序的.fsproj文件来解决此问题,以删除对FSharp.Core的原始引用,并将其替换为对较新版本的引用(我从PCL .fsproj文件复制/粘贴标签)。它看起来像这样:

<Reference Include="FSharp.Core"> 
    <Name>FSharp.Core</Name> 
    <Private>True</Private> 
    <AssemblyName>FSharp.Core.dll</AssemblyName> 
    <HintPath>$(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll</HintPath> 
</Reference> 

我很惊讶,发现这似乎已经解决了我的问题。我不确定我是否会遇到其他问题,但如果您还没有,可能值得尝试。

UPDATE如果这不起作用,请按照Rob Lyndon的回答中的步骤顺序。

+0

感谢您的提示。我试过这个,但不幸的是它不适合我,所以我需要做更多的挖掘。我相信这是FSharp.Core的一个版本问题,但我不清楚为了纠正这种情况我需要做些什么。 –

+0

我可以认为这是解决此问题的正确方法。查看我提交的问题(列在问题中)以获取问题的详细描述。您的修复应该没有问题。 –

0

看来,这已被固定在GitHub上提交

https://github.com/xamarin/xamarin-android/commit/df41af046000556ed82f638e8041b7f718966a92

从框架组件列表中删除FSharp.Core,并允许该项目没有的NuGet待建FSharp.Core程序集被替换。

在此修复程序发布到SDK之前,有一种解决方法。由user3850711提交的答案有效,但您需要以特定顺序应用更改,否则参考将在构建过程中被覆盖。

  1. 删除现有的参考FSharp.Core
  2. 安装或重新安装FSharp.Core NuGet软件包。
  3. 卸载项目并将<HintPath>packages\FSharp.Core.4.0.0.1\lib\portable-net45+monoandroid10+monotouch10+xamarinios10\FSharp.Core.dll</HintPath>添加到FSharp.Core项目参考中。