I read that you can't compile C# 6.0 with CSharpCodeProvider and therefor trying to do with with Roslyn. But I can't find a good example how to load a file and then compile it to a dll.
How should I write something similar to this code with Roslyn? Or is there some other way to do it? Now when I try to compile files that contain reference to projects with C# 6.0 code it just say "The type or namespace name 'x' does not exist in the namespace 'y' (are you missing an assembly reference?)"
public string CompileCode() { var provider = new CSharpCodeProvider(); var outputPath = Path.Combine(Path.GetDirectoryName(_path), $"Code.dll"); var compilerparams = new CompilerParameters(_referencedAssemblies, outputPath); CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path); var dllPath = results.PathToAssembly; if (!results.Errors.HasErrors) return dllPath; PrintError(results.Errors); return ""; }
In summary I want to:
Step 1: Open turbo C IDE(Integrated Development Environment), click on File and then click on New. Step 2: Write the C program code. Step 3: Click on Compile or press Alt + F9 to compile the code. Step 4: Click on Run or press Ctrl + F9 to run the code.
Run the gcc command to compile your C program. The syntax you'll use is gcc filename. c -o filename.exe . This compiles the program and makes it executable.
I have created a sample for you to work with. You need to tweak it to use the run time for .Net 4.6 so that CSharp6 version is availble to you. I have added little details so that you can choose the options of compilations.
Changes required - Change the path of runtime to target .Net 4.6 Change the LanguageVersion.Csharp5
to LanguageVersion.Csharp6
in below sample.
class Program { private static readonly IEnumerable<string> DefaultNamespaces = new[] { "System", "System.IO", "System.Net", "System.Linq", "System.Text", "System.Text.RegularExpressions", "System.Collections.Generic" }; private static string runtimePath = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\{0}.dll"; private static readonly IEnumerable<MetadataReference> DefaultReferences = new[] { MetadataReference.CreateFromFile(string.Format(runtimePath, "mscorlib")), MetadataReference.CreateFromFile(string.Format(runtimePath, "System")), MetadataReference.CreateFromFile(string.Format(runtimePath, "System.Core")) }; private static readonly CSharpCompilationOptions DefaultCompilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithOverflowChecks(true).WithOptimizationLevel(OptimizationLevel.Release) .WithUsings(DefaultNamespaces); public static SyntaxTree Parse(string text, string filename = "", CSharpParseOptions options = null) { var stringText = SourceText.From(text, Encoding.UTF8); return SyntaxFactory.ParseSyntaxTree(stringText, options, filename); } static void Main(string[] args) { var fileToCompile = @"C:\Users\DesktopHome\Documents\Visual Studio 2013\Projects\ConsoleForEverything\SignalR_Everything\Program.cs"; var source = File.ReadAllText(fileToCompile); var parsedSyntaxTree = Parse(source, "", CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp5)); var compilation = CSharpCompilation.Create("Test.dll", new SyntaxTree[] { parsedSyntaxTree }, DefaultReferences, DefaultCompilationOptions); try { var result = compilation.Emit(@"c:\temp\Test.dll"); Console.WriteLine(result.Success ? "Sucess!!" : "Failed"); } catch (Exception ex) { Console.WriteLine(ex); } Console.Read(); }
This would need little tweaks but it should give you desired results. Change it as you may wish.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With