public async Task <T> ExecuteAsync(string code, string globalState) { var arguments = new List <string>() { "fsi.exe", "--noninteractive", "--nologo", "--gui-" }.ToArray(); var stringReader = new StringReader(globalState); var outputStringBuilder = new StringBuilder(); var errorStringBuilder = new StringBuilder(); var outputStream = new StringWriter(outputStringBuilder); var errorStream = new StringWriter(errorStringBuilder); var fSharpOptions = new FSharpOption <bool>(true); var resolverOptions = new FSharpOption <Resolver>(default(Resolver)); var sessionConfiguration = FsiEvaluationSession.GetDefaultConfiguration(); var evaluationSession = FsiEvaluationSession.Create(sessionConfiguration, arguments, stringReader, outputStream, errorStream, fSharpOptions, resolverOptions); var result = evaluationSession.EvalExpression(code); var fSharpValue = await Task.FromResult(result.Value); return((T)fSharpValue.ReflectionValue); }
FsiEvaluationSession GetFsi() { lock (_fsi_lock) { if (_fsi != null) { return(_fsi); } var noneFalse = FSharpOption <bool> .None; var sbOut = new StringBuilder(); var outStream = new StringWriter(sbOut); var sbErr = new StringBuilder(); var errStream = new StringWriter(sbErr); var exePath = Assembly.GetExecutingAssembly().CodeBase; //var scriptDomDll = Path.Combine(exePath, "Microsoft.SqlServer.TransactSql.ScriptDom.dll"); var libPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); var inSb = new StringBuilder(); var inStream = new StringReader(inSb.ToString()); var fsiConfig = FsiEvaluationSession.GetDefaultConfiguration(); var argvBuilder = new List <string>(); // C:\Program Files (x86)\Microsoft SDKs\F#\3.0\Framework\v4.0 argvBuilder.Add(@"C:\Program Files (x86)\Microsoft SDKs\F#\4.1\Framework\v4.0\fsi.exe"); //argvBuilder.Add(Path.Combine(exePath, "fsi.exe")); argvBuilder.Add($"--lib:{libPath}"); //argvBuilder.Add(libPath); // Path.Combine(exePath, "Microsoft.SqlServer.TransactSql.ScriptDom.dll")); var argv = argvBuilder.ToArray(); var fsi = FsiEvaluationSession.Create(fsiConfig, argv, inStream, outStream, errStream, noneFalse, noneFalse); foreach (var line in new[] { "open System", "open System.IO", "open System.Text", "open System.Collections.Generic", @"#r ""Microsoft.SqlServer.TransactSql.ScriptDom.dll""", "open Microsoft.SqlServer.TransactSql" }) { fsi.EvalInteraction(line); } sbOut.Clear(); _fsi = fsi; return(fsi); } }