嵌入 F# 交互式示例从 FSharp.Compiler.Service 引发异常
Embedding F# Interactive Example Throwing Exception from FSharp.Compiler.Service
我正在研究 http://fsharp.github.io/FSharp.Compiler.Service/interactive.html 中的嵌入 F# 交互式示例,但我遇到以下行引发异常的问题:
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.
我运行ning的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
如有任何想法,我们将不胜感激。
您的问题的关键在于 Compiler Services: Notes on FSharp.Core.dll
If doing dynamic compilation and execution you may also need to
include an FSharp.Core.optdata and FSharp.Core.sigdata, see below for
guidance.
构建应用程序时,FSharp.Core.dll
的输出目录缺少两个文件:
FSharp.Core.optdata
FSharp.Core.sigdata
您需要找到这两个文件以及符合 FSharp.Core.dll 的文件的正确版本,并将它们复制到构建输出目录。
如何使用Visual Studio
查找文件
从菜单查看 -> 解决方案资源管理器
展开项目
展开参考文献
右键单击 FSharp.Core 和 select 属性。
完整路径给出至少应包含三个文件的目录。
使用文件资源管理器打开完整路径中的目录。
复制这两个文件
FSharp.Core.optdata
FSharp.Core.sigdata
到构建目录。
如何使用Visual Studio找到构建目录
从菜单查看 -> 解决方案资源管理器
Select 项目
按 F4 打开属性页
带有\bin\Debug
的项目文件夹是使用VS调试时的默认文件夹。
更改 fsi.exe
的位置
现在您已经有了两个需要的文件,您还需要更改 fsi.exe
的位置
let argv = [| "C:\fsi.exe" |]
因为我怀疑fsi.exe在你C盘的根目录下。
我正在研究 http://fsharp.github.io/FSharp.Compiler.Service/interactive.html 中的嵌入 F# 交互式示例,但我遇到以下行引发异常的问题:
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.
我运行ning的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
如有任何想法,我们将不胜感激。
您的问题的关键在于 Compiler Services: Notes on FSharp.Core.dll
If doing dynamic compilation and execution you may also need to include an FSharp.Core.optdata and FSharp.Core.sigdata, see below for guidance.
构建应用程序时,FSharp.Core.dll
的输出目录缺少两个文件:
FSharp.Core.optdata
FSharp.Core.sigdata
您需要找到这两个文件以及符合 FSharp.Core.dll 的文件的正确版本,并将它们复制到构建输出目录。
如何使用Visual Studio
查找文件从菜单查看 -> 解决方案资源管理器
展开项目
展开参考文献
右键单击 FSharp.Core 和 select 属性。
完整路径给出至少应包含三个文件的目录。 使用文件资源管理器打开完整路径中的目录。
复制这两个文件
FSharp.Core.optdata
FSharp.Core.sigdata
到构建目录。
如何使用Visual Studio找到构建目录
从菜单查看 -> 解决方案资源管理器
Select 项目
按 F4 打开属性页
带有\bin\Debug
的项目文件夹是使用VS调试时的默认文件夹。
更改 fsi.exe
的位置现在您已经有了两个需要的文件,您还需要更改 fsi.exe
的位置let argv = [| "C:\fsi.exe" |]
因为我怀疑fsi.exe在你C盘的根目录下。