F# 从TypeProvider引用Newtonsoft.Json
我正在尝试创建使用Newtonsoft.Json的类型提供程序。提供的构造函数接受F# 从TypeProvider引用Newtonsoft.Json,f#,json.net,type-providers,F#,Json.net,Type Providers,我正在尝试创建使用Newtonsoft.Json的类型提供程序。提供的构造函数接受JObject: let constr = ProvidedConstructor([ProvidedParameter("json",typeof<JObject>)]) constr.InvokeCode <- fun args -> <@@ let jObject = %%args.[0]:JObject jObject @@
JObject
:
let constr = ProvidedConstructor([ProvidedParameter("json",typeof<JObject>)])
constr.InvokeCode <- fun args ->
<@@
let jObject = %%args.[0]:JObject
jObject
@@>
调试类型提供程序时,我可以看到Newtonsoft.Json.dll有两个版本:我的项目中nuget下载位置的版本6.0.3.17227和C:\Program Files\Common Files\Microsoft Shared\Visual Studio\12.0\Newtonsoft.Json.dll的版本4.5.11.15520
后者显然是由VisualStudio2013更新2 for Json编辑器加载的
客户端和类型提供程序程序集都指定版本重定向:
我如何解决这个问题
编辑:
事实证明,仅仅摆脱Json.NET的VS版本并不是一个好的解决方案。VS在开始时抛出异常,它会隐藏该异常,直到您尝试使用其他帐户登录。我甚至不想去猜测它背后的逻辑,简单的回答是——不要把VS搞得一团糟
对于类型提供程序,解决方法是在所有TP提供的方法中用字符串替换JObject,并在实现中将其解析为JObject
让我们希望VS团队能对此做些什么。检查VisualStudio目录中的NewtonSoft.Json是否确实存在。我曾一度在尝试开发类型提供程序时经历了惊人的痛苦,直到我意识到,在3个月前的几天里,NuGet一直在解包我安装到C:\Program Files\Common Files\Microsoft Shared\Visual Studio\12.0 \-的所有依赖项,而这些依赖项是在类型提供程序能够加载任何内容之前加载的。作为一个(非常小的)安慰奖,如果您与我有相同的问题,TP将在FSI/编译代码中运行-只是不在Visual Studio中。如果您幸运,它可能会在返回到错误版本之前触发System.AppDomain.CurrentDomain.AssemblyResolve事件。如果是这样的话,您可以在事件处理程序中重定向它,我已经修复了类似的问题。谢谢你的提示,没有帮助:(.我甚至没有在这个事件处理程序中遇到断点。我怀疑这是Visual Studio错误。如果我只是从普通代码中引用不兼容的Json.Net版本,我不知道它如何工作。我希望在设计时看到错误的错误通知。现在,加上@RossMcKinlay提供的
AssemblyResolve
提示,成功了!没有AssemblyResolve
Studio抱怨它找不到版本6.0.0事件,尽管我可以看到版本6.0.3已加载。非常感谢,伙计们!这也解决了我遇到的一个问题,即F#interactive恢复到旧版本的NewtonSoft.json,非常感谢。
type ProvidedType = MyProvider<"source.file">
let json = JObject.Parse(str)
let objct = ProvidedType("""{ "name" = "foo bar" }""")