2017-01-03 44 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項目參考中。