使用 Process.Start 启动 f# interactive
Starting f# interactive with Process.Start
所以我将代码剥离为不起作用的部分,如下所示:
[<EntryPoint>]
let main argv =
let procStart = new ProcessStartInfo(argv.[0], argv.[1..] |> String.concat " ")
procStart.RedirectStandardInput <- true
let proc = Process.Start(argv.[0], argv.[1..] |> String.concat " ")
let y = Console.ReadLine()
0
所以我用命令行参数启动程序 "fsi"。
fsi 是 f# interactive,它在我的路径上,所以我假设绝对路径并不重要。程序启动正常,然后它启动了 fsi 进程,该进程启动并在一瞬间显示红色错误后关闭。我无法快速阅读错误,所以我打印了屏幕来获取图片,所以可能会有一两个错字,但这是错误:
unknown(1,1): error FSI1223: FSharp.Core.sigdata not found alongside FSharp.Core
unknown(1,1): error FS0229: Error opening binary file 'Path\to\project\bin\debug\FSharp.Core': Exception of type 'Microsoft.FSharp.Compiler.ErrorLogger+StopProcessing was thrown.
还有一些关于无法读取 f#.core 程序集的问题。
我的理论是这样的:
我可以从普通的 cmd window 启动 fsi;我在想,当我从 cmd 启动 fsi 时,它会在与 fsi 相同的目录中查找 f#.core,但是当我使用 Process.Start 启动它时,由于某种原因它会在当前目录中查找。
我不知道我是不是对的,即使我是对的我也不知道如何解决这个问题。
我不确定为什么会发生这种情况,但是您可以通过将 ProcessStartInfo.WorkingDirectory
属性 设置为 fsi
本身所在的位置来解决它。
Fyoder 给了我解决的线索,所以我接受了他的回答,但还不够清楚。
问题是 fsi
和父进程正在尝试使用 FSharp.Core.dll,这将导致崩溃 fsi
。 fsi
首先在当前目录中查找dll,它找到了,所以它假定可以使用。当在没有 dll 的目录中调用 `fsi 时,它工作正常,因为它在 fsi 文件夹中找到了那个。
这应该可以解释为什么 ProcessStartInfo.WorkingDirectory
解决了这个问题。
请注意,您可以将其设置为其中没有FSharp.Core.dll的任何文件夹
所以我将代码剥离为不起作用的部分,如下所示:
[<EntryPoint>]
let main argv =
let procStart = new ProcessStartInfo(argv.[0], argv.[1..] |> String.concat " ")
procStart.RedirectStandardInput <- true
let proc = Process.Start(argv.[0], argv.[1..] |> String.concat " ")
let y = Console.ReadLine()
0
所以我用命令行参数启动程序 "fsi"。 fsi 是 f# interactive,它在我的路径上,所以我假设绝对路径并不重要。程序启动正常,然后它启动了 fsi 进程,该进程启动并在一瞬间显示红色错误后关闭。我无法快速阅读错误,所以我打印了屏幕来获取图片,所以可能会有一两个错字,但这是错误:
unknown(1,1): error FSI1223: FSharp.Core.sigdata not found alongside FSharp.Core
unknown(1,1): error FS0229: Error opening binary file 'Path\to\project\bin\debug\FSharp.Core': Exception of type 'Microsoft.FSharp.Compiler.ErrorLogger+StopProcessing was thrown.
还有一些关于无法读取 f#.core 程序集的问题。
我的理论是这样的: 我可以从普通的 cmd window 启动 fsi;我在想,当我从 cmd 启动 fsi 时,它会在与 fsi 相同的目录中查找 f#.core,但是当我使用 Process.Start 启动它时,由于某种原因它会在当前目录中查找。
我不知道我是不是对的,即使我是对的我也不知道如何解决这个问题。
我不确定为什么会发生这种情况,但是您可以通过将 ProcessStartInfo.WorkingDirectory
属性 设置为 fsi
本身所在的位置来解决它。
Fyoder 给了我解决的线索,所以我接受了他的回答,但还不够清楚。
问题是 fsi
和父进程正在尝试使用 FSharp.Core.dll,这将导致崩溃 fsi
。 fsi
首先在当前目录中查找dll,它找到了,所以它假定可以使用。当在没有 dll 的目录中调用 `fsi 时,它工作正常,因为它在 fsi 文件夹中找到了那个。
这应该可以解释为什么 ProcessStartInfo.WorkingDirectory
解决了这个问题。
请注意,您可以将其设置为其中没有FSharp.Core.dll的任何文件夹