【问题标题】:Runtime error using Xamarin Android with F# and ReactiveUI使用带有 F# 和 ReactiveUI 的 Xamarin Android 时出现运行时错误
【发布时间】:2017-01-03 13:58:35
【问题描述】:

我创建了一个使用 F# 和 ReactiveUI 的 Xamarin Android 项目。

加载我的仪表板时,我在此代码 sn-p 的 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 错误跟踪器上提交了一个错误:https://bugzilla.xamarin.com/show_bug.cgi?id=51000

是否有任何已知的修复程序我可以自己实施,以便我可以自行关闭错误?

更新 1

这个周末我一直在调查这个问题。

加载的 FSharp.Core 版本卡在过时的版本 2.3.98.1 上。这对应于

中的FSharp.Core.dll文件

C:\Program Files (x86)\参考 程序集\Microsoft\Framework\MonoAndroid\v1.0

我已尝试删除此版本并加载 NuGet 包 FSharp.Core;但是,当我构建 Android 项目时,该路径始终会还原为 Reference Assemblies 路径中的过时文件。

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

更新 2

替换Reference Assemblies 路径中的FSharp.Core.dll 文件可以解决问题,但这是一个非常不令人满意的粘贴膏,我无法要求我的用户申请。理想情况下,我想找到一种方法来阻止 .Droid 项目从 GAC 而不是 NuGet 包加载 FSharp.Core

【问题讨论】:

  • 我猜MissingMemberException 等价于MissingMethodException。如果是这样,这里的一些现有帖子可能会对您有所帮助:stackoverflow.com/search?q=%5Bf%23%5D+MissingMethodException
  • 我的错误——它是MissingMethodException。问题已修改。
  • IME 总是由版本冲突引起的。
  • 这些通常可以通过绑定重定向来解决。不幸的是,我的项目是 Xamarin Android 项目,所以我不能使用 app.config 文件。

标签: android xamarin f# xamarin.forms reactiveui


【解决方案1】:

前几天我遇到了一个非常相似的问题。我的 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> 

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

更新如果这不能立即起作用,请按照 Rob Lyndon 的回答中的步骤顺序进行操作。

【讨论】:

  • 感谢您的提示。我试过这个,但不幸的是它对我不起作用,所以我需要做更多的挖掘。我确定这是 FSharp.Core 的版本控制问题,但还不清楚我必须采取什么措施来补救这种情况。
  • 我可以确认这是解决此问题的正确方法。查看我提交的错误(问题中列出)以获取问题的详细描述。您的修复应该没有问题。
【解决方案2】:

看来这个问题已经被 GitHub 提交修复了

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

从框架程序集列表中删除 FSharp.Core,并允许在不替换 NuGet FSharp.Core 程序集的情况下构建项目。

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

  1. 删除对FSharp.Core的现有引用。
  2. 安装或重新安装FSharp.Core NuGet 包。
  3. 卸载项目并将&lt;HintPath&gt;packages\FSharp.Core.4.0.0.1\lib\portable-net45+monoandroid10+monotouch10+xamarinios10\FSharp.Core.dll&lt;/HintPath&gt; 添加到FSharp.Core 项目引用中。

【讨论】:

    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多