【问题标题】:Starting f# interactive with Process.Start使用 Process.Start 启动 f# 交互
【发布时间】:2016-04-01 06:13:02
【问题描述】:

所以我将代码剥离为不起作用的部分,如下所示:

[<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# 交互式的,它在我的路径上,所以我假设绝对路径无关紧要。该程序启动良好,然后启动 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 启动它时,它会出于某种原因在当前目录中查找。

我不知道我是否正确,即使我是,我也不知道如何解决这个问题。

【问题讨论】:

  • 要验证您的理论,请尝试设置ProcessStartInfo.WorkingDirectory
  • @FyodorSoikin 解决了我的问题。我不知道那个属性,谢谢。
  • 好的,那样的话我会把它作为答案贴出来,让大家看到

标签: .net windows process f#


【解决方案1】:

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

【讨论】:

  • 如果您对它起作用的原因感到好奇,我在下面给出了更完整的答案
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多