Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I target a specific language version using CodeDOM?

Tags:

c#

.net

codedom

csc

Using the C# code provider and the ICodeCompiler.CompileAssemblyFromSource method, I am attempting to compile a code file in order to produce an executable assembly.

The code that I would like to compile makes use of features such as optional parameters and extension methods that are only available when using the language C# 4.

Having said that, the code that I would like to compile only requires (and needs) to target version 2.0 of the .NET Framework.


Using the proceeding code it is possible to avoid any compile-time errors pertaining to syntax however, the resulting assembly will target version 4.0 of the framework which is undesirable.

var compiler = new CSharpCodeProvider(
        new Dictionary<string, string> { { "CompilerVersion", "v4.0" } } );

How can I make is so that the code provider targets language version 4.0 but produces an assembly that only requires version 2.0 of the framework?

like image 651
Caster Troy Avatar asked Nov 16 '13 13:11

Caster Troy


People also ask

What is CodeDOM used for?

What is CodeDom ? CodeDom (Code Document Object Model) is a language independent Object-model which is used for developing automatic source code generators.

Why use CodeDOM C#?

The CodeDOM provides types that represent many common types of source code elements. You can design a program that builds a source code model using CodeDOM elements to assemble an object graph. This object graph can be rendered as source code using a CodeDOM code generator for a supported programming language.

How do I change the version of C#?

Navigate to Properties -> Build -> Advanced, select “C# latest minor version(latest)” to pick latest installed minor version. The C# latest major version is the default language version set, and choosing the “C# latest minor version” it will always refer to latest C# version, in this case it will refer to C# 7.2.

What statement can you type in C# to discover the compiler and language version?

Get C# Version using Command Prompt Using Visual studio Command prompt: csc /langversion:? C# compiler determines a default language version based on your project's target framework.


1 Answers

You need to instruct the C# compiler (that CSharpCodeProvider uses indirectly) that you want to link to another mscorlib.dll, using the /nostdlib option. Here is a sample that should do it:

static void Main(string[] args)
{
    // defines references
    List<string> references = new List<string>();

    // get a reference to the mscorlib you want
    var mscorlib_2_x86 = Path.Combine(
                         Environment.GetFolderPath(Environment.SpecialFolder.Windows),
                         @"Microsoft.NET\Framework\v2.0.50727\mscorlib.dll");
    references.Add(mscorlib_2_x86);

    // ... add other references (System.dll, etc.)

    var provider = new CSharpCodeProvider(
                   new Dictionary<string, string> { { "CompilerVersion", "v4.0" } });
    var parameters = new CompilerParameters(references.ToArray(), "program.exe");
    parameters.GenerateExecutable = true;

    // instruct the compiler not to use the default mscorlib
    parameters.CompilerOptions = "/nostdlib";              

    var results = provider.CompileAssemblyFromSource(parameters,
        @"using System;

        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(""Hello world from CLR version: "" + Environment.Version);
            }
        }");
}

If you run this, it should compile a program.exe file. If you run that file, it should display something like this:

Hello world from CLR version: 2.0.50727.7905
like image 151
Simon Mourier Avatar answered Sep 17 '22 14:09

Simon Mourier