From 064acda30468bc0aceabd34fb49b9dd224ddb64e Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Wed, 2 Sep 2020 10:17:33 +0200 Subject: [PATCH] First shake at RoslynCompiler --- .../RoslynCompiler.cs | 52 +++++++++++++++++++ .../Umbraco.ModelsBuilder.Embedded.csproj | 4 ++ 2 files changed, 56 insertions(+) create mode 100644 src/Umbraco.ModelsBuilder.Embedded/RoslynCompiler.cs diff --git a/src/Umbraco.ModelsBuilder.Embedded/RoslynCompiler.cs b/src/Umbraco.ModelsBuilder.Embedded/RoslynCompiler.cs new file mode 100644 index 0000000000..43a9202c13 --- /dev/null +++ b/src/Umbraco.ModelsBuilder.Embedded/RoslynCompiler.cs @@ -0,0 +1,52 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Text; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; + +namespace Umbraco.ModelsBuilder.Embedded +{ + public class RoslynCompiler + { + private OutputKind _outputKind; + private CSharpParseOptions _parseOptions; + + public RoslynCompiler() + { + _outputKind = OutputKind.DynamicallyLinkedLibrary; + _parseOptions = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.Latest); // What languageversion should we default to? + } + + public Assembly GetCompiledAssembly(string pathToSourceFile, IEnumerable refs) + { + // TODO: Get proper temp file location/filename + var outputPath = $"generated.cs.{Guid.NewGuid()}.dll"; + var sourceCode = File.ReadAllText(pathToSourceFile); + + CompileToFile(outputPath, sourceCode, "ModelsGenerated", refs); + return Assembly.LoadFile(outputPath); + + } + + private void CompileToFile(string outputFile, string sourceCode, string assemblyName, IEnumerable references) + { + var sourceText = SourceText.From(sourceCode); + + var syntaxTree = SyntaxFactory.ParseSyntaxTree(sourceText, _parseOptions); + + var compilation = CSharpCompilation.Create(assemblyName, + new[] { syntaxTree }, + references: references, + options: new CSharpCompilationOptions(_outputKind, + optimizationLevel: OptimizationLevel.Release, + // Not entirely certain that assemblyIdentityComparer is nececary? + assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default)); + + compilation.Emit(outputFile); + } + } +} diff --git a/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj b/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj index 0046c568f1..ff6d55d8eb 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj +++ b/src/Umbraco.ModelsBuilder.Embedded/Umbraco.ModelsBuilder.Embedded.csproj @@ -10,6 +10,10 @@ bin\Release\Umbraco.ModelsBuilder.Embedded.xml + + + +