从FSharp.Compiler.Service嵌入F#Interactive Example Throwing Exception

Tom*_*ood 6 f# f#-interactive

我正在研究来自http://fsharp.github.io/FSharp.Compiler.Service/interactive.html的Embedding F#Interactive示例,但是出现以下行引发异常的问题:

let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream)
Run Code Online (Sandbox Code Playgroud)

抛出的异常是:

"FSharp.Compiler.Service.dll中发生了'System.Exception'类型的未处理异常附加信息:创建评估会话时出错:StopProcessing null"

我的项目是从VS2015 Enterprise Update 1运行的,设置为一个简单的F#控制台应用程序,目标F#运行时为F#4.0,目标框架为4.6.从nuget下载的FSharp.Compiler.Service版本是2.0.0.2.

我正在运行的Program.Fs文件代码在这里(示例的直接端口):

open System
open System.IO
open System.Text
open Microsoft.FSharp.Compiler.SourceCodeServices
open Microsoft.FSharp.Compiler.Interactive.Shell

[<EntryPoint>]
let main argv =

    let sbOut = new StringBuilder()
    let sbErr = new StringBuilder()
    let inStream = new StringReader("")
    let outStream = new StringWriter(sbOut)
    let errStream = new StringWriter(sbErr)

    // Build command line arguments & start FSI session
    let argv = [| "C:\\fsi.exe" |]
    let allArgs = Array.append argv [|"--noninteractive"|]

    let fsiConfig = FsiEvaluationSession.GetDefaultConfiguration()
    let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream)

    /// Evaluate expression & return the result
    let evalExpression text =
        match fsiSession.EvalExpression(text) with
        | Some value -> printfn "%A" value.ReflectionValue
        | None -> printfn "Got no result!"

    evalExpression "42+1" // prints '43'

    Console.ReadLine() |> ignore

    0  // return integer
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激.

Guy*_*der 6

您可以在Compiler Services上找到问题的关键:FSharp.Core.dll上的注释

如果进行动态编译和执行,您可能还需要包含FSharp.Core.optdata和FSharp.Core.sigdata,请参阅下面的指导.

构建应用程序时,输出目录FSharp.Core.dll缺少两个文件:

FSharp.Core.optdata  
FSharp.Core.sigdata
Run Code Online (Sandbox Code Playgroud)

您需要找到这两个文件以及与FSharp.Core.dll一致的文件的正确版本,并将它们复制到构建输出目录.

如何使用Visual Studio查找文件

从菜单视图 - >解决方案资源管理器
展开项目
展开参考
右键单击FSharp.Core并选择属性.

在此输入图像描述

完整路径提供至少应包含三个文件的目录.使用文件资源管理器以完整路径打开目录.

在此输入图像描述

复制这两个文件

FSharp.Core.optdata  
FSharp.Core.sigdata
Run Code Online (Sandbox Code Playgroud)

到构建目录.

如何使用Visual Studio查找构建目录

从菜单视图 - >解决方案资源管理器
选择项目
按F4打开属性页面

在此输入图像描述

\bin\Debug使用VS进行调试时,Project Folder with 是默认值.

更改fsi.exe的位置

既然您有两个所需的文件,您还需要更改fsi.exe的位置

let argv = [| "C:\\fsi.exe" |]
Run Code Online (Sandbox Code Playgroud)

因为我怀疑fsi.exe是在C盘的根目录中.