gpt4 book ai didi

f# - 从 TypeProvider 引用 Newtonsoft.Json

转载 作者:行者123 更新时间:2023-12-01 23:55:18 25 4
gpt4 key购买 nike

我正在尝试创建使用 Newtonsoft.Json 的类型提供程序。提供的构造函数接受 JObject:

let constr = ProvidedConstructor([ProvidedParameter("json",typeof<JObject>)])  
constr.InvokeCode <- fun args ->
<@@
let jObject = %%args.[0]:JObject
jObject
@@>

客户端代码:

type ProvidedType = MyProvider<"source.file">
let json = JObject.Parse(str)
let objct = ProvidedType("""{ "name" = "foo bar" }""")

它在设计时失败并出现以下错误:

Type mismatch when splicing expression into quotation literal. The type of the
expression tree being inserted doesn't match the type expected by the splicing
operation.
Expected 'Newtonsoft.Json.Linq.JObject', but received type
'Newtonsoft.Json.Linq.JObject'.
Consider type-annotating with the expected expression type, e.g.,
(%% x : string) or (%x : string).

调试类型提供程序时,我可以看到有两个版本的 Newtonsoft.Json.dll:来 self 项目中 nuget 下载位置的版本 6.0.3.17227 和来自 C:\Program Files\Common Files\的版本 4.5.11.15520 Microsoft Shared\Visual Studio\12.0\Newtonsoft.Json.dll。

后者显然是由 Visual Studio 2013 Update 2 for Json 编辑器加载的。

客户端和类型提供程序程序集都指定版本重定向:

<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.3.0" />
</dependentAssembly>

我该如何解决?

编辑:

事实证明,仅仅摆脱 Json.NET 的 VS 版本并不是一个好的解决方案。 VS 在开始时抛出异常,它会隐藏,直到您尝试使用不同的帐户登录。我什至不想尝试猜测其背后的逻辑,简短的回答是 - 不要乱用 VS。

对于Type Provider,解决方法是在TP提供的所有方法中将JObject替换为字符串,并在实现中将其解析为JObject。

希望 VS 团队能为此做点什么。

最佳答案

检查 Visual Studio 目录中的 NewtonSoft.Json 是否实际应该存在。我曾一度尝试开发类型提供程序时感到非常痛苦,直到我意识到在 3 个月前的几天里,NuGet 一直在解压缩我安装到 C:\Program Files\Common Files\Microsoft Shared\Visual 的所有依赖项Studio\12.0\- 那些在类型提供程序加载任何内容之前就已加载。作为(非常小的)安慰奖,如果您遇到与我相同的问题,TP 将在 FSI/编译代码中运行——只是不在 Visual Studio 中。

关于f# - 从 TypeProvider 引用 Newtonsoft.Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com