【问题标题】:Using F# JsonProvider within a portable class library fails在可移植类库中使用 F# JsonProvider 失败
【发布时间】:2014-03-13 07:26:00
【问题描述】:

我正在尝试使用 JsonProvider,当我在其上调用函数时出现以下错误:

System.TypeInitializationException was unhandled
Message: An unhandled exception of type 'System.TypeInitializationException' occurred in PortableLibrary1.dll
Additional information: The type initializer for '<StartupCode$PortableLibrary1>.$PortableLibrary1' threw an exception.

我有一个基本的控制台应用程序如下:

module Pinit =
   open FSharp.Data

   type JsonT = JsonProvider<"""..\myFile.json""">
   let doc = JsonT.Load("""..\nyFile.json""")
   let result = doc.GeneratedAt

[<EntryPoint>]
let main argv = 
    printfn "%A" Pinit.doc.GeneratedAt
    0 

在 ConsoleApplication 中运行时,一切都按预期工作。 如果我按如下方式创建 F# 可移植类库:

module Pinit =
   open FSharp.Data

   type JsonT = JsonProvider<"""..\myFile.json""">
   let doc = JsonT.Load("""..\nyFile.json""")
   let result = doc.GeneratedAt

创建另一个控制台应用程序并引用该可移植类库并调用代码如下:

open PortableLibrary1

[<EntryPoint>]
let main argv = 
    printfn "%A" Pinit.result
    0 

当我运行程序时,它会生成上面定义的异常:

我怀疑这是因为 FSharp.Core 的版本,但想知道我是否做错了什么,或者是否有办法让它工作?

版本:

-- ConsoleApplication --
FSharp.Core = 4.3.1.0

-- PortableClassLibrary --
FSharp.Core = 3.3.1.0
FSharp.Data = NuGet Version: 2.0.0

【问题讨论】:

  • Pinit.result 是什么?
  • 我已经通过分配给 Pinit.result 的任务更新了我的问题。这只是 JsonProvider 分配的结果。在这种情况下,它恰好是 System.DateTime

标签: f# type-providers f#-data


【解决方案1】:

让绑定编译成静态成员,而在 .NET 中,当静态初始化程序中有异常时,真正的异常会被伪装。

如果您通过更改为 let result() = doc.GeneratedAtprintfn "%A" (Pinit.result()) 将其转换为函数调用,您将得到真正的异常:

Only web locations are supported

便携式配置文件不支持访问文件系统。因此,在 PCL 中,您既可以拥有 Web url,也可以从嵌入式资源手动加载。请参阅此处的示例:https://github.com/ovatsus/Apps/blob/master/Trains/Stations.fs#L65。或者您可以在控制台项目中加载带有File.ReadAllText 的文件并将其传递给PCL。

这是一个便携式配置文件(旧版)项目,即 Profile 47(和 FSharp.Core 2.3.6.0)。然后我还测试了一个便携式配置文件项目,即 Profile 7(和 FSharp.Core 3.3),并注意到它无法正常工作,而是给出了这个异常

Method not found: 'FSharp.Data.Runtime.JsonValueOptionAndPath FSharp.Data.Runtime.JsonRuntime.TryGetPropertyUnpackedWithPath(FSharp.Data.Runtime.IJsonDocument, System.String)'.

我创建了一个 github 问题来跟踪它:https://github.com/fsharp/FSharp.Data/issues/521

【讨论】:

  • 谢谢。我现在已经切换到使用嵌入式资源,但不幸的是我使用的是 Profile 7,所以我遇到了上面提到的 Method Not Found 异常。
猜你喜欢
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多