Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compile a C# file with Roslyn programmatically?

Tags:

c#

roslyn

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:

  • Load a C# file
  • Compile it to a dll so I can load it later.
like image 818
MilleB Avatar asked Sep 24 '15 19:09

MilleB


People also ask

How do I compile and run C code?

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.

What is the command to compile C?

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.


1 Answers

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.

like image 90
vendettamit Avatar answered Sep 22 '22 22:09

vendettamit