如何动态编译C#7代码?

时间:2017-08-30 07:55:12

标签: c# compilation mono c#-7.0

我有一个简单的代码,我尝试动态编译:

namespace A
{
    class Test
    {
        public static void Test()
        {                
            int.TryParse("12", out int result);
        }
    }
}

通常我使用CSharpCodeProviderCodeDomProvider。不幸的是,转换到C#6 / C#7后,我收到以下错误:

  

错误CS1644:无法使用功能“声明表达式”,因为它是        不属于C#6.0语言规范

当然整个代码确实包含C#7功能,并且使用msbuild / xbuild编译得很好。

我理解错误,但我不知道是否还有其他方法可以编译此代码?

重要通知 - 我在Mono上运行它,但我现在没有选择尝试.Net的选项。它可能是单声道问题,但它看起来似乎是通用的。

1 个答案:

答案 0 :(得分:4)

错误消息似乎表明您使用的编译器版本理解声明表达式,但已设置为不允许它们。

在Ubuntu 16.04(Mono 4.2.1)中包含的最新版Mono中包含的CodeDOM版本就是这种情况。在该版本中,您可以通过设置/langversion:experimental

来允许声明表达式

在CodeDOM中,您可以通过设置CompilerParameters.CompilerOptions来实现,例如:

compiler.CompileAssemblyFromSource(
    new CompilerParameters { CompilerOptions = "/langversion:experimental" }, code);

使用此代码,您的源代码将在Mono 4.2.1上为我编译。但由于它是此版本编译器的实验性功能,因此可能无法完美运行。

升级您的Mono版本可能有所帮助。

我相信/langversion:experimental特定于Mono,因此此代码可能不会在.Net的其他实现上工作。