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); }
private static CompilationPackage BuildCompilationPackage(ScriptClassSourceCode classSourceCode) { var package = new CompilationPackage(); package.SourceCodes.Add(new SourceCodeUnit(classSourceCode.SourceCode, classSourceCode.ClassName + ".cs")); return(package); }
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); }
private static IEnumerable <string> GetAssembliesFromUsings(IEnumerable <UsingDirectiveSyntax> usings, CompilationPackage compilationPackage) { var assemblies = new List <string> { typeof(object).Assembly.Location }; assemblies.AddRange(compilationPackage.ReferencedAssemblyFiles); if (compilationPackage.AddAllLoadedAssemblyReferences) { var loadedAssemblies = ReflectionUtils.GetAllAssemblies(); usings.ForEach(usingDirective => GetAssemblyForUsing(usingDirective, loadedAssemblies, assemblies)); } if (compilationPackage.AddNetStandardReferences) { assemblies.AddRange(GetNetStandardAssemblies()); } return(assemblies.Distinct()); }