【问题标题】:How can I target a specific language version using CodeDOM?如何使用 CodeDOM 定位特定语言版本?
【发布时间】:2013-11-29 21:40:01
【问题描述】:

使用 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 版的程序集?

【问题讨论】:

  • 您已经针对特定的 compiler 版本 - 您不知道如何针对特定的 framework 版本。我建议您相应地更新您的问题(尤其是标题)。
  • 您是否尝试过在以后编译时指定CompilerParameters,并专门传递一组与您尝试定位的框架匹配的程序集?
  • 您可能还需要使用CompilerOptions 属性来传递/nostdlib+ /noconfig(除了传递正确版本的系统程序集之外)。见blogs.msdn.com/b/ed_maurer/archive/2010/03/31/…
  • 哇...this question 提出了正确的问题,但所有答案都是错误的(指定语言版本和编译器,而不是框架)

标签: c# .net codedom csc


【解决方案1】:

您需要使用/nostdlib option 指示要链接到另一个mscorlib.dll 的C# 编译器(CSharpCodeProvider 间接使用)。这是一个应该这样做的示例:

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

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 2019-04-07
    • 2010-10-23
    • 1970-01-01
    • 2011-01-26
    • 2015-01-09
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多