public void Compile_SimpleTestScript_AddMethodReturnsCorrectValue() { var compiler = new RoslynCompiler(); var outputStream = new MemoryStream(); var compilationPackage = new CompilationPackage(); compilationPackage.AddReferenceAssembly(typeof(ISimpleScript).Assembly); compilationPackage.SourceCodes.Add(new SourceCodeUnit(TestScripts.SimpleScript, "Test.cs")); var compilationOutput = new CompilationOutput(CompilationOutputKind.DynamicallyLinkedLibrary, new StreamCompilationOutputData(outputStream)); var compilerResult = compiler.Compile(compilationPackage, compilationOutput); Assert.Empty(compilerResult.Messages.Where(x => x.MessageType == CompilationMessageType.Error)); var assembly = Assembly.Load(outputStream.ToArray()); var simpleScript = assembly.CreateInstance( "CreativeCoders.CodeCompilation.UnitTests.TestData.SimpleScript") as ISimpleScript; var value = simpleScript?.AddIntegers(12, 34); Assert.Equal(46, value); }
public static CompiledScript CompileScript(string script, string name = "") { Output = new CompilationOutput(); script = script.Replace("\r\n", ""); var compiled = new CompiledScript(script); compiled.Name = name; if (!CODE_INFO.Scripts.Contains(compiled)) { CODE_INFO.Scripts.Add(compiled); } return(compiled); }
public ICompilationResult Compile(CompilationPackage compilationPackage, CompilationOutput compilationOutput) { Ensure.IsNotNull(compilationOutput, nameof(compilationOutput)); var syntaxTrees = CreateSyntaxTrees(compilationPackage.SourceCodes).ToArray(); var assemblyFiles = GetAssembliesFromUsings( syntaxTrees.SelectMany(syntaxTree => syntaxTree.GetCompilationUnitRoot().Usings.Select(usingDirective => usingDirective)), compilationPackage); var compilation = CreateCompilation(syntaxTrees, assemblyFiles, compilationPackage, compilationOutput); return(new RoslynCompilationResult(compilation, compilationOutput.OutputData)); }
private static CSharpCompilation CreateCompilation(IEnumerable <SyntaxTree> syntaxTrees, IEnumerable <string> assemblyFiles, CompilationPackage compilationPackage, CompilationOutput compilationOutput) { var assemblyName = compilationPackage.AssemblyName; if (string.IsNullOrWhiteSpace(assemblyName)) { assemblyName = FileSys.Path.ChangeExtension(FileSys.Path.GetRandomFileName(), ".dll"); } var references = GetReferences(assemblyFiles); var compilation = CSharpCompilation.Create(assemblyName, syntaxTrees, references, new CSharpCompilationOptions(RoslynConvert.ConvertOutputKind(compilationOutput.OutputKind))); return(compilation); }