小编h_s*_*h_s的帖子

如何使用带有fsharpi(fsi)和mono的stdin管道

我使用fsharpi(fsi)作为后台编译过程使用System.Diagnostics.Process来生成进程.我的ProcessStartInfo设置如下所示:

let psi = new ProcessStartInfo()
psi.UseShellExecute <- false
if System.Environment.OSVersion.Platform = PlatformID.Unix
    then
        psi.FileName <- "/usr/bin/mono"
        psi.Arguments <- "/usr/lib/fsharp/fsi.exe"
    else
        psi.FileName <- @"C:\Program Files (x86)\Microsoft F#\v4.0\fsi.exe"
        psi.Arguments <- ""
psi.WorkingDirectory <- "some workdir"
psi.CreateNoWindow <- true
psi.RedirectStandardError <- true
psi.RedirectStandardInput <- true
psi.RedirectStandardOutput <- true
Run Code Online (Sandbox Code Playgroud)

我的过程创建如下:

let proc = Process.Start(psi)
Run Code Online (Sandbox Code Playgroud)

之后我使用stdin发出我的代码:

proc.StandardInput.WriteLine(myCode+";;"+Environment.NewLine)
proc.StandardInput.Flush()
Run Code Online (Sandbox Code Playgroud)

这适用于带有标准设置的VisualStudio的Windows 7 - 不幸的是它不适用于linux(ubuntu 11.04,Mono JIT编译器版本2.6.7(Debian 2.6.7-5ubuntu3),F#,Microsoft(R)F#2.0 Interactive build 2.0. 0.0)[注意:从源代码构建的单声道2.10也是如此].无论如何,StandardOutput在两个平台上都能正常工作.

编辑:澄清如何/什么不起作用:在收到标准启动输出(F#,Microsoft(R)F#...)后,我通过重定向输入流发送一些代码(让我们说让foo x = x*2).使用重定向输出同步(在另一个线程中)接收答案(使用proc.StandardOut.ReadLine()但ReadLine永远不会返回!

我怀疑fsharpi正在运行的(额外进程)mono或平台问题(换行等)是一个问题.

为了排除我尝试手动管道的第二种可能性.为此,我创建了一个包含内容的文件:

"#quit;;[NEWLINE]"
Run Code Online (Sandbox Code Playgroud)

其中[NEWLINE代表Unix端言和Windows风格EOL]

使用以下命令(窗口):

fsi.exe < thefileDescribedAbove
Run Code Online (Sandbox Code Playgroud)

或者分别(linux)

fsharpi < …
Run Code Online (Sandbox Code Playgroud)

.net linux mono f#

5
推荐指数
1
解决办法
1216
查看次数

标签 统计

.net ×1

f# ×1

linux ×1

mono ×1