Search code examples
compiler-errorsroslynroslyn-code-analysisroslyn-project-system

OutKind.ConsoleApplication Err(Roslyn Compiler)


I compiling with roslyn some Diagnostics Error showing My code is below:

using System;
using System.Reflection;
using System.Runtime.Loader;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
using System.IO;
using Microsoft.CodeAnalysis;

namespace RoslynTest
{
    public class Test
    {
        public static void Main(string[] args)
        {
             const string code =@"using System;
namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(""Hello, World!"");
        }
    }
}";

        var tree = SyntaxFactory.ParseSyntaxTree(code);
            var compilation = CSharpCompilation.Create("HelloWorldCompiled.exe", options: new CSharpCompilationOptions(OutputKind.ConsoleApplication),
                syntaxTrees: new[] { tree }, references: new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) });
            using (var stream = new MemoryStream())
            {
                var compileResult = compilation.Emit(stream);
                var assembly = Assembly.Load(stream.GetBuffer());
                assembly.EntryPoint.Invoke(null, BindingFlags.NonPublic | BindingFlags.Static, null, new object[] { null }, null);
            }
        }
    }
}

Err Coming this line:--> var compileResult = compilation.Emit(stream); Err is: The name 'Console' doesn't exist in current context.(Diagnostics Err) how to solve this err


Solution

  • The Console type is located in System.Console.dll

    typeof(Console).Assembly.Location -> C:\Program Files\dotnet\shared\Microsoft.NETCore.App\...\System.Console.dll

    This can be fixed by using the correct references:

    var runtimeDir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
    var tree = SyntaxFactory.ParseSyntaxTree(code);
    var compilation = CSharpCompilation.Create("HelloWorldCompiled", 
        options: new CSharpCompilationOptions(OutputKind.ConsoleApplication),
        syntaxTrees: new[] { tree },
        references: new[]
        {
            MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
            MetadataReference.CreateFromFile(Path.Combine(runtimeDir, "System.Console.dll")),
            MetadataReference.CreateFromFile(Path.Combine(runtimeDir, "System.Runtime.dll"))
        });