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

Posted

技术标签:

【中文标题】从 FSharp.Compiler.Service 嵌入 F# 交互式示例引发异常【英文标题】:Embedding F# Interactive Example Throwing Exception from FSharp.Compiler.Service 【发布时间】:2016-01-18 15:40:26 【问题描述】:

我正在处理来自 http://fsharp.github.io/FSharp.Compiler.Service/interactive.html 的嵌入 F# Interactive 示例,但遇到以下行引发异常的问题:

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

抛出的异常是:

“在 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

任何想法都将不胜感激。

【问题讨论】:

What are F#'s FSharp.Core.optdata and FSharp.Core.sigdata files? 【参考方案1】:

您的问题的关键在于Compiler Services: Notes on FSharp.Core.dll

如果进行动态编译和执行,您可能还需要 包括 FSharp.Core.optdata 和 FSharp.Core.sigdata,见下文 指导。

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

FSharp.Core.optdata  
FSharp.Core.sigdata

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

如何使用 Visual Studio 查找文件

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

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

复制这两个文件

FSharp.Core.optdata  
FSharp.Core.sigdata

到构建目录。

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

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

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

更改 fsi.exe 的位置

现在您有了两个所需的文件,您还需要更改 fsi.exe 的位置

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

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

【讨论】:

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

以上是关于从 FSharp.Compiler.Service 嵌入 F# 交互式示例引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如何从其他面板从 JTextField 获取输入

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?