如何使用CodeDOM定位特定语言版本?

15

使用 C# 代码提供程序以及 ICodeCompiler.CompileAssemblyFromSource 方法,我正在尝试编译一个代码文件以生成可执行的程序集。

我想要编译的代码使用了一些仅在使用 C# 4 语言时才可用的功能,例如可选参数和扩展方法。

尽管如此,我想要编译的代码仅需要(且需要)针对 .NET Framework 的 2.0 版本进行编译。


使用上述方法可以避免任何与语法相关的编译时错误,但是生成的程序集将针对不希望使用的框架版本 4.0 进行编译。

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

我如何使代码提供者针对语言版本4.0,但生成的程序集仅需要框架版本2.0?


1
你已经在针对特定的编译器版本 - 你不知道的是如何针对特定的框架版本。我建议你相应地更新你的问题(特别是标题)。 - Jon Skeet
你尝试过在稍后编译时指定CompilerParameters,并明确传递一组与你要针对的框架匹配的程序集吗? - Ben Voigt
您可能还需要使用CompilerOptions属性来传递/nostdlib+ /noconfig(除了传递正确版本的系统程序集)。请参阅http://blogs.msdn.com/b/ed_maurer/archive/2010/03/31/multi-targeting-and-the-c-and-vb-compilers.aspx。 - Ben Voigt
哇...有一个问题问得很对(https://dev59.com/uFrUa4cB1Zd3GeqPmbfp),但所有的答案都是错的(指定语言版本和编译器,而不是框架)。 - Ben Voigt
1个回答

12

你需要指导 C# 编译器(CSharpCodeProvider 间接使用的)链接到另一个 mscorlib.dll,使用 /nostdlib 选项。以下示例应该可以实现:

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);
            }
        }");
}
如果您运行此命令,它将编译一个名为program.exe的文件。如果您运行该文件,它应该显示类似于以下内容的东西:
Hello world from CLR version: 2.0.50727.7905

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接