F# 嵌入从FSharp.Compiler.Service引发异常的交互式示例

F# 嵌入从FSharp.Compiler.Service引发异常的交互式示例,f#,f#-interactive,F#,F# Interactive,我正在处理来自的Embedded F Interactive示例,但遇到以下行引发异常的问题: let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream) 引发的异常是: FSharp.Compiler.Service.dll中发生类型为“System.exception”的未处理异常 其他信息:创建评估会话时出错:停止处理null 我的项目是从VS2015 E

我正在处理来自的Embedded F Interactive示例,但遇到以下行引发异常的问题:

let fsiSession = FsiEvaluationSession.Create(fsiConfig, allArgs, inStream, outStream, errStream)
引发的异常是:

FSharp.Compiler.Service.dll中发生类型为“System.exception”的未处理异常 其他信息:创建评估会话时出错:停止处理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

如果您有任何想法,我们将不胜感激。

您的问题的关键在于

如果执行动态编译和执行,您可能还需要 包括FSharp.Core.optdata和FSharp.Core.sigdata,有关详细信息,请参阅下文 指导

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

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

如何使用VisualStudio查找文件

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

完整路径给出了至少应该包含这三个文件的目录。 使用文件资源管理器以完整路径打开目录

复制这两个文件

FSharp.Core.optdata  
FSharp.Core.sigdata
到生成目录

如何使用Visual Studio查找生成目录

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

使用VS调试时,带有\bin\Debug的项目文件夹是默认文件夹

更改fsi.exe的位置

let argv = [| "C:\\fsi.exe" |]
既然您有了所需的两个文件,您还需要更改fsi.exe的位置

let argv = [| "C:\\fsi.exe" |]

因为我怀疑fsi.exe是否在您的C驱动器的根目录中。

很好的解释,但在复制文件后我仍然收到相同的错误。