使用Process.Start启动f#interactive

时间:2015-12-26 22:27:45

标签: .net windows process f#

所以我把代码剥离到了什么不起作用,接下来是:

[<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窗口启动fsi;我想当我从cmd启动fsi时,它看起来和fsi在同一个目录中找到f#.core,但是当我用Process.Start启动它时,由于某种原因它会在当前目录中查找。

我不知道我是不对,即使我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

我不确定为什么会发生这种情况,但您可以通过将ProcessStartInfo.WorkingDirectory属性设置为fsi本身所在的位置来解决此问题。

答案 1 :(得分:0)

Fyoder给了我解决方案的线索,所以我接受了他的答案,但还不够清楚。

问题是fsi和父进程正在尝试使用FSharp.Core.dll,这会导致fsi崩溃。 fsi首先在当前目录中查找dll,然后找到它,因此它假定它可以使用。当在没有dll的目录中调用`fsi时,它可以正常工作,因为它找到了fsi文件夹中的那个。

这可以解释为什么ProcessStartInfo.WorkingDirectory解决了这个问题。 请注意,您可以将其设置为任何没有FSharp.Core.dll的文件夹