Azure功能:“无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息”

时间:2017-03-13 02:44:32

标签: azure f# azure-functions

我有一个F#Azure功能失败,以一种奇怪的方式,并且不知道如何解决问题。我在下面创建了一个实际案例的最小重复。手动触发测试功能,并使用FSharp.Compiler.Service作为依赖关系,如下面project.json中所述:

{
  "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.

...这让我很困惑,因为

  1. foo甚至不在任何地方召唤
  2. 签名和第二版都使用LongIdent,因此这种类型似乎不是问题的根源。
  3. 关于如何处理问题以及问题本身可能是什么的任何建议都将非常感激 - 我甚至不知道从哪里开始,并且相同的代码在本地脚本中运行得非常好。

2 个答案:

答案 0 :(得分:4)

我认为原因是Azure Functions SDK依赖于FSharp.Compiler.Service (FCS) version 9.0.1。这意味着当您尝试加载不同版本的FCS时,您将获得已加载的版本9.0.1。

只要您使用的FCS版本的公共API与版本9.0.1的公共API匹配,这就有效,但是当存在差异时,它会崩溃,因为您的代码假定公共API看起来不同。我想这可能会触发这里的问题,虽然我不是100%确定如何(可能LongIdent现在与版本9.0.1不同?)

同样的问题used to happen with FAKE,它还捆绑了FCS并阻止加载不同的版本。其中一个选项是rename the assembly to avoid the clash

答案 1 :(得分:0)

我也遇到了同样的错误,我通过以下解决方法解决了这个问题,请参考它是否适用于您。

  • 右键单击项目并选择属性。
  • 转到“调试”选项卡并创建一个引用以下内容的配置文件 屏幕截图。

注意:将UserName替换为您的用户名。

Project Properties