public void ClassicModeTest() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, CompilerMode = ScriptCompilerModes.Classic }; script.AddDefaultReferencesAndNamespaces(); //script.AddAssembly("Westwind.Utilities.dll"); //script.AddNamespace("Westwind.Utilities"); var code = $@" public string Add(int num1, int num2) {{ // string templates var result = num1 + "" + "" + num2 + "" = "" + (num1 + num2); Console.WriteLine(result); return result; }} "; string result = script.ExecuteMethod(code, "Add", 10, 5) as string; Console.WriteLine("Result: " + result); Assert.IsFalse(script.Error, script.ErrorMessage); }
public void ExecuteMethodTest() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, CompilerMode = ScriptCompilerModes.Roslyn }; script.AddDefaultReferencesAndNamespaces(); string code = $@" public string HelloWorld(string name) {{ string result = $""Hello {{name}}. Time is: {{DateTime.Now}}.""; return result; }}"; string result = script.ExecuteMethod(code, "HelloWorld", "Rick") as string; Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Console.WriteLine(script.GeneratedClassCode); Assert.IsFalse(script.Error); Assert.IsTrue(result.Contains("Hello Rick")); // Just invoke the method again directly without any compilation/building // this is the fastest way to do multiple invocations. result = script.InvokeMethod(script.ObjectInstance, "HelloWorld", "Markus") as string; Console.WriteLine($"Result: {result}"); Assert.IsFalse(script.Error); Assert.IsTrue(result.Contains("Hello Markus")); }
public void CompileClassTest() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, CompilerMode = ScriptCompilerModes.Roslyn }; script.AddDefaultReferencesAndNamespaces(); var code = $@" using System; namespace MyApp {{ public class Math {{ public string Add(int num1, int num2) {{ // string templates var result = num1 + "" + "" + num2 + "" = "" + (num1 + num2); Console.WriteLine(result); return result; }} public string Multiply(int num1, int num2) {{ // string templates var result = $""{{num1}} * {{num2}} = {{ num1 * num2 }}""; Console.WriteLine(result); result = $""Take two: {{ result ?? ""No Result"" }}""; Console.WriteLine(result); return result; }} }} }} "; dynamic math = script.CompileClass(code); Console.WriteLine(script.GeneratedClassCodeWithLineNumbers); Assert.IsFalse(script.Error, script.ErrorMessage); Assert.IsNotNull(math); string addResult = math.Add(10, 20); string multiResult = math.Multiply(3, 7); Assert.IsTrue(addResult.Contains(" = 30")); Assert.IsTrue(multiResult.Contains(" = 21")); }
public void ExecuteMoreThanOneMethodTest() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, CompilerMode = ScriptCompilerModes.Roslyn }; script.AddDefaultReferencesAndNamespaces(); string code = $@" public string HelloWorld(string name) {{ string result = $""Hello {{name}}. Time is: {{DateTime.Now}}.""; return result; }} public string GoodbyeName {{ get; set; }} public string GoodbyeWorld() {{ string result = $""Goodbye {{GoodbyeName}}. Time is: {{DateTime.Now}}.""; return result; }} "; string result = script.ExecuteMethod(code, "HelloWorld", "Rick") as string; Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Console.WriteLine(script.GeneratedClassCode); Assert.IsFalse(script.Error); Assert.IsTrue(result.Contains("Hello Rick")); dynamic instance = script.ObjectInstance; instance.GoodbyeName = "Markus"; result = instance.GoodbyeWorld(); Console.WriteLine($"Result: {result}"); Assert.IsTrue(result.Contains("Goodbye Markus")); }
public void ExecuteCodeSnippetWithoutResult() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, }; script.AddDefaultReferencesAndNamespaces(); string result = script.ExecuteCode("Console.WriteLine($\"Time is: {DateTime.Now}\");", null) as string; Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Console.WriteLine(script.GeneratedClassCode); Assert.IsFalse(script.Error, script.ErrorMessage); }
public void EvaluateTest() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, }; script.AddDefaultReferencesAndNamespaces(); // Full syntax //object result = script.Evaluate("(decimal) parameters[0] + (decimal) parameters[1]", 10M, 20M); // Numbered parameter syntax is easier object result = script.Evaluate("(decimal) @0 + (decimal) @1", 10M, 20M); Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Console.WriteLine(script.GeneratedClassCode); Assert.IsFalse(script.Error, script.ErrorMessage); Assert.IsTrue(result is decimal, script.ErrorMessage); }
/// <summary> /// Evaluates the embedded script parsing out {{ C# Expression }} /// blocks and evaluating the expressions and embedding the string /// output into the result string. /// /// /// </summary> /// <param name="snippet">The snippet template to expand</param> /// <param name="model">Optional model data accessible in Expressions as `Model`</param> /// <returns></returns> public string EvaluateScript(string snippet, object model = null) { #if DEBUG var sw = new Stopwatch(); sw.Start(); #endif var tokens = TokenizeString(ref snippet, "{{", "}}"); snippet = snippet.Replace("\"", "\"\""); snippet = DetokenizeString(snippet, tokens); snippet = snippet.Replace("{{", "\" + ").Replace("}}", " + @\""); snippet = "@\"" + snippet + "\""; string code = "dynamic Model = parameters[0];\r\n" + "return " + snippet + ";"; //var scriptCompiler = new ScriptRunnerRoslyn(); var scriptCompiler = new CSharpScriptExecution() { CompilerMode = ScriptCompilerModes.Roslyn }; scriptCompiler.AddDefaultReferencesAndNamespaces(); scriptCompiler.AddAssemblies("System.dll", "System.Core.dll", "System.Drawing.dll", "Microsoft.CSharp.dll", "System.Data.dll", "MarkdownMonster.exe", "Westwind.Utilities.dll", "System.Configuration.dll", "Newtonsoft.Json.dll"); scriptCompiler.AddNamespaces("System", "System.IO", "System.Reflection", "System.Text", "System.Drawing", "System.Diagnostics", "System.Data", "System.Data.SqlClient", "System.Linq", "System.Collections.Generic", "Newtonsoft.Json", "Newtonsoft.Json.Linq", "MarkdownMonster", "Westwind.Utilities"); string result = scriptCompiler.ExecuteCode(code, model) as string; if (result == null) { ErrorMessage = scriptCompiler.ErrorMessage; } else { ErrorMessage = null; } #if DEBUG sw.Stop(); Debug.WriteLine("ScriptParser Code: \r\n" + code); Debug.WriteLine("Snippet EvaluateScript Execution Time: " + sw.ElapsedMilliseconds + "ms"); #endif return(result); }
public void ExecuteCodeSnippetWithResult() { var script = new CSharpScriptExecution() { SaveGeneratedCode = true, CompilerMode = ScriptCompilerModes.Roslyn, GeneratedNamespace = "ScriptExecutionTesting", GeneratedClassName = "MyTest" }; script.AddDefaultReferencesAndNamespaces(); //script.AddAssembly("Westwind.Utilities.dll"); //script.AddNamespace("Westwind.Utilities"); var code = $@" // Check some C# 6+ lang features var s = new {{ name = ""Rick""}}; // anonymous types Console.WriteLine(s?.name); // null propagation int num1 = (int)parameters[0]; int num2 = (int)parameters[1]; // string templates var result = $""{{num1}} + {{num2}} = {{(num1 + num2)}}""; Console.WriteLine(result); return result; "; string result = script.ExecuteCode(code, 10, 20) as string; Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Console.WriteLine(script.GeneratedClassCodeWithLineNumbers); Assert.IsFalse(script.Error, script.ErrorMessage); Assert.IsTrue(result.Contains(" = 30")); result = script.ExecuteCode(code, 15, 10) as string; Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Assert.IsFalse(script.Error, script.ErrorMessage); Assert.IsTrue(result.Contains(" = 25")); script = new CSharpScriptExecution() { SaveGeneratedCode = true, GeneratedClassName = "MyTest" }; script.AddDefaultReferencesAndNamespaces(); result = script.ExecuteCode(code, 4, 10) as string; Console.WriteLine($"Result: {result}"); Console.WriteLine($"Error: {script.Error}"); Console.WriteLine(script.ErrorMessage); Assert.IsFalse(script.Error, script.ErrorMessage); Assert.IsTrue(result.Contains(" = 14")); }