我有一个F#Azure功能失败,以一种奇怪的方式,并不知道如何解决问题.我在下面创建了一个实际案例的最小重复.测试函数是手动触发的,并使用FSharp.Compiler.Service作为依赖项,如下面的projec
{ "frameworks": { "net46":{ "dependencies": { "FSharp.Compiler.Service": "11.0.6" } } } }
run.fsx文件如下所示:
open System open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Ast open Microsoft.FSharp.Compiler.Interactive.Shell let Run(input: string, log: TraceWriter) = // code here that uses FsiEvaluationSession // and runs just fine log.Info "I RAN"
到现在为止还挺好.困扰我的部分是,如果我在Run上面添加以下功能,
// same dependencies as before open Microsoft.FSharp.Compiler.Interactive.Shell let foo (longIdent:LongIdent) = // version 1 // "FOO" // version 2 // longIdent.ToString () // version 3 longIdent |> List.map string let Run(input: string, log: TraceWriter) = // same as before
单独取消注释第1部分工作正常,单独的第2部分单独工作正常,取消注释第3部分会导致地狱破裂.该函数编译,但运行它会导致以下异常:
Exception while executing function: Functions.fsc-1. mscorlib: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
……这让我感到困惑,因为
> foo甚至不在任何地方调用
>签名和第二版都使用LongIdent,所以这种类型似乎不是问题的根源.
任何关于如何处理问题的建议,以及问题本身可能是什么,都将非常感激 – 我甚至不知道从哪里开始,并且相同的代码在本地脚本中运行得非常好.
我认为原因是Azure Functions SDK依赖于 FSharp.Compiler.Service (FCS) version 9.0.1.这意味着当您尝试加载不同版本的FCS时,您将获得已加载的版本9.0.1.只要您使用的FCS版本的公共API与版本9.0.1的公共API匹配,这就有效,但是当存在差异时,它会崩溃,因为您的代码假定公共API看起来不同.我想这可能会触发这里的问题,虽然我不是百分之百确定如何(可能,LongIdent现在与9.0.1版本不同?)
同样的问题used to happen with FAKE,它也捆绑FCS并阻止加载不同的版本.其中一个选项是rename the assembly to avoid the clash.