.net F#编译器在从派生进程调用时引发异常

.net F#编译器在从派生进程调用时引发异常,.net,process,f#,.net,Process,F#,我生成了一个新进程,并让它像这样调用F#编译器: var-exeName=args[0]; var commandLine=args[1]; 使用(var进程=新进程()) { process.StartInfo=新的ProcessStartInfo(exeName,commandLine); process.StartInfo.UseShellExecute=true; process.StartInfo.LoadUserProfile=true; process.Start(); } 我传

我生成了一个新进程,并让它像这样调用F#编译器:

var-exeName=args[0];
var commandLine=args[1];
使用(var进程=新进程())
{
process.StartInfo=新的ProcessStartInfo(exeName,commandLine);
process.StartInfo.UseShellExecute=true;
process.StartInfo.LoadUserProfile=true;
process.Start();
}
我传入的参数是fsc.exe的路径和我要生成的代码的参数。
结果是例外:

Unhandled Exception: System.ArgumentException: chop_extension
   at Internal.Utilities.Filename.chop_extension(String s)
   at Microsoft.FSharp.Compiler.Build.TcConfigBuilder.DecideNames(FSharpList`1 sourceFiles)
   at Microsoft.FSharp.Compiler.Driver.main1(String[] argv)
   at Microsoft.FSharp.Compiler.ErrorLogger.ErrorLoggerExtensions.ReraiseIfWatsonable(Exception exn)
   at Microsoft.FSharp.Compiler.ErrorLogger.ErrorLoggerExtensions.ErrorLogger.ErrorRecovery(ErrorLogger x, Exception exn, range m)
   at Microsoft.FSharp.Compiler.ErrorLogger.errorRecovery(Exception exn, range m)
   at Microsoft.FSharp.Compiler.Driver.main1(String[] argv)
   at Microsoft.FSharp.Compiler.Driver.main(String[] argv)
   at Microsoft.FSharp.Compiler.CommandLineMain.main(String[] argv)
   at Microsoft.FSharp.Compiler.ErrorLogger.ErrorLoggerExtensions.ReraiseIfWatsonable(Exception exn)
   at Microsoft.FSharp.Compiler.ErrorLogger.ErrorLoggerExtensions.ErrorLogger.ErrorRecovery(ErrorLogger x, Exception exn, range m)
   at Microsoft.FSharp.Compiler.ErrorLogger.errorRecovery(Exception exn, range m)
   at Microsoft.FSharp.Compiler.CommandLineMain.main(String[] argv)
但是,当我从命令提示符运行相同的命令和参数时,它编译时不会出错


知道是什么导致了这种情况吗?

在不知道要传递给编译器的参数的情况下,很难给出具体的答案-错误可能来自于某些格式错误的命令行参数

但是,如果要从C#调用F#编译器,则不需要显式地使用
进程
类。您可以使用中提供的F#CodeDom提供程序-它负责格式化参数(以及定位F#编译器,这可能非常微妙)

下面是一个简单的例子,展示了如何从F#调用它(从C#调用类似):


你使用了哪些论据?可能是输入字符串格式不正确。您是从C代码调用fsc exe吗?这就是第一个代码片段的样子,我只想确认一下我的假设。我同意Pad的观点——向我们展示exeName和commandLine的值。我没有意识到可以直接从代码中实现这一点。很高兴知道。
#r "FSharp.Compiler.CodeDom.dll"

open System.CodeDom.Compiler
open Microsoft.FSharp.Compiler.CodeDom

let provider = new FSharpCodeProvider()
let parameters = CompilerParameters()
provider.CompileAssemblyFromFile(parameters, [| "C:...file.fsx" |])