Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }