15

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?

4
  • 1
    You're already targeting a specific compiler version - what you don't know is how to target a specific framework version. I suggest you update your question (particularly the title) accordingly. Commented Nov 16, 2013 at 13:29
  • Have you tried specifying the CompilerParameters when you later compile, and specifically passing a set of assemblies which match the framework you are trying to target? Commented Nov 19, 2013 at 6:36
  • You may also need to use the CompilerOptions property to pass /nostdlib+ /noconfig (in additional to passing the right version of the system assemblies). See blogs.msdn.com/b/ed_maurer/archive/2010/03/31/… Commented Nov 19, 2013 at 6:43
  • Wow... there's this question that asks the right thing but all the answers are wrong (specify language version and compiler, not framework) Commented Nov 19, 2013 at 6:44

1 Answer 1

12
+25

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.