Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Azure Function: "Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information"

I have an F# Azure Function that is failing, in a bizarre way, and don't know how to approach fixing the issue. I created a minimum repro of the actual case below. The test function is manually triggered and uses FSharp.Compiler.Service as a dependency, as specified in the project.json below:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "FSharp.Compiler.Service": "11.0.6"
      }
    }
  }
}

The run.fsx file looks like this:

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"

So far, so good. The part that baffles me is that if I add the following function above 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

Uncommenting section 1 alone works fine, uncommenting section 2 alone works fine, uncommenting section 3 causes hell to break loose. The function compiles, but running it causes the following exception:

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.

... which is puzzling to me, because

  1. foo isn't even called anywhere
  2. the signature and the 2nd version both use LongIdent, so this type doesn't seem to be the source of the problem.

Any suggestion on how to approach the problem, and what the problem itself might be, would be very appreciated - I don't even know where to start, and the same code runs perfectly fine in a local script.

like image 522
Mathias Avatar asked Mar 13 '17 02:03

Mathias


1 Answers

I believe the reason for this is that Azure Functions SDK depend on FSharp.Compiler.Service (FCS) version 9.0.1. This means that when you try to load a different version of FCS, you will get the already loaded version 9.0.1.

This works as long as the public API of the FCS version you are using matches the public API of version 9.0.1, but when there are differences, it will crash, because your code assumes that the public API looks different. I suppose this might be triggering the issue here, although I'm not 100% sure how (possibly, LongIdent is now a different thing than it was in version 9.0.1?)

The very same issue used to happen with FAKE, which also bundles FCS and prevented loading of different versions. One of the options is to rename the assembly to avoid the clash.

like image 126
Tomas Petricek Avatar answered Nov 13 '22 19:11

Tomas Petricek